http://www.7klian.com

如安在万维链 Wanchain 上打造可进级智能合约

如图 2 所示,是典范的 call() 挪用,重点存眷两个合约的上下文。Caller 合约的 msg.sender 和 msg.value 都是用户(EOA)发送的生意业务中的数据。Target 合约的上下文变了,msg.sender 和 msg.value 酿成了 Caller 合约的生意业务数据,不再是用户(EOA)的了。这个照旧很好领略的。

一、合约进级面对的问题

图 2 call 流程图

这个时候,挑剔的措施员大概会提出新的挑战,假如要新增特性,需要修改数据布局怎么办?上面说到的只是修改逻辑,而现实中修改数据布局也是很常见的需求。这个也是有步伐办理的,就是在设计数据布局的时候全部用 Key-Value 的 Map 数据布局,这种布局的长处是原则上可以无限扩展。当需要生存新的数据,只要从头界说一个新的 Key 就可以了。这样做的价钱就是代码的可读性下降不少,原来一些可以用布局体很容易做到的,却要生生拆成 Key-Value 的 Map 数据。所以我的发起是可以利用折中方案,就是开拓第一版的时候照旧利用常见的数据布局,可读性好,开拓周期也短一些。但同时界说一些常见范例的 Key-Value 的 Map 用于扩展。当进级合约的时候需要新增数据,就利用这些预留好的 Map 去扩展,究竟这样的需求并不是那么常见。

我们再看图 3,Caller 合约跟图 2 没有不同,但 Target 的 msg.sender 和 msg.value 居然照旧用户(EOA)的生意业务数据,很神奇。这就是 delegatecall() 跟 call() 的本质区别,delegatecall() 并不会切换合约的上下文,也就是 Target 合约利用的是 Caller 的存储空间,修改的也是 Caller 的存储空间。

https://github.com/wa nchain/wanchain-crosschain-contracts/tree/eos-wan-cross/eos-wan-cross/solidity/contracts

Wanchain 的智能合约利用的是 solidity 语言,用过 solidity 语言的人都知道,假如智能合约有 bug 可能需要扩展新的特性,将是一个庞大的挑战。源码自己的修改措施员都能搞定,最大的挑战是 solidity 每次陈设合约后,合约地点城市改变,这样就面对许多棘手的问题:

三、Wanchain 智能合约实例

到此为止,相信措施员已经知道如何去设计本身的可进级 solidity 智能合约了。但照旧需要实践才气贯通得更深刻。Wanchain 的 EOS 跨链智能合约用的就是 Proxy-Delegate 架构,可以作为很好的参考。

万维区块链常识大课堂之智能合约篇:如安在 Wanchain 上打造可进级智能合约?由 Wanchain 技能团队研发总监 Gabriel Guo 为各人缓缓道来如何建设数据和逻辑疏散、数据布局可扩展的可进级智能合约。

图 1 合约数据和逻辑疏散示意图

pragma solidity ^0.4.24; contract Proxy {address public owner; event Upgraded(address indexed implementation); address internal _implementation; constructor() public { owner = msg.sender;} modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _;} function implementation() public view returns (address) { return _implementation;} function upgradeTo(address impl) public onlyOwner { require(impl != address(0), "Cannot upgrade to invalid address"); require(impl != _implementation, "Cannot upgrade to the same implementation"); _implementation = impl; emit Upgraded(impl);} function () external payable { address _impl = _implementation; require(_impl != address(0), "implementation contract not set"); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } }}

图 3 delegatecall 流程图

最后需要提醒一下措施员,利用 Proxy-Delegate 的架构实现可进级智能合约,是有约束条件的,就是 Proxy 和 Delegate 合约的状态变量的界说要保持一致,顺序也要保持一致。切记切记,不然呈现问题是很难调试的。

如图 1 所示,Data 合约和 Logical 合约 A 开拓完成,陈设到链上,Logical 合约 A 需要用到的数据都通过合约间挪用存储在 Data 合约内里。两个合约形成了一个整体处事。DApps 只需要挪用 Logical 合约 A 的 ABI (应用措施二进制接口)。溘然有一天发明白严重的 bug,于是修复完 bug 后,陈设 Logical 合约 B 到链上,修改 DApps 指向新的 Logical 合约 B,从而到达了进级合约的目标,完美的制止了数据的迁移。

图 4 署理合约和逻辑合约示意图

因此,措施员就自然而然的思考能不能打造一种可进级的智能合约架构呢?谜底是必定的,本文将具体叙述如何做到这一点。

正文

有细心的措施员这时候会提出质疑,上述要领固然能办理数据迁移的痛点,可是要修改所有利用该智能合约的 DApps,还长短常的贫苦。那么别着急,下面先容一种更高级的数据和逻辑疏散的要领,同时办理上述的两个痛点。

在开始先容新的要领之前,要引入一种 solidity 内里的观念:delegate call。Solidity 提供了几种合约之间挪用的要领,最常用的是 call(),大部门合约都是利用的 call()。此刻说的是不太常见的 delegatecall(),这里只是简朴的说明一下 call() 和 delegatecall() 的区别,具体的先容请各人自行 Google。

四、Proxy 合约模板

所有的用到了该合约的 DApps 都需要修改合约地点来适配新的合约

写在前面

Wanchain,中文名万维链,聚焦于跨链机制的研发,通过构建具有跨链本领的漫衍式金融基本设施来实现万链互联的雄伟方针。停止今朝,,Wanchain 已乐成跨链集成比特币、以太坊、EOS 以及以太坊和 EOS 上的生态代币,并设计提出了通用跨链框架 T-Bridge,旨在实现资产和数据在差异公链和同盟链间的自由流转。在共鸣机制方面,Wanchain 设计并上线了拥有完整委托机制的实用 PoS 共鸣协议,即星系共鸣。岂论是跨链机制,照旧共鸣协议,Wanchain 一直处于行业的领先位置。

关于 Wanchain

链上合约里的数据要迁移到新的合约内里,一般会对旧合约做快照,然后把数据导入到新合约中。这种方法的不敷之处在于事情量大,需要剧本扫链,很容易堕落。一旦堕落,效果大概是无法包袱的

Wanchain 作为一条出力打造漫衍式金融基本设施的跨链公链,在跨链协议、跨链尺度拟定、PoS 机制研究、随机数生成、dApp 应用场景、行业办理方案、合约设计模式等诸多方面,万维链团队有着扎实的理论基本和富厚的实践履历。承袭兼容并包的区块链精力,Wanchain 团队创办“万维区块链常识大课堂”栏目,凭借团队的技能积淀,由团队技能大咖亲自执笔,按期为整个行业孝敬有趣、有代价、有意义的内容输出,为业内业外的普通用户和专业用户抛砖引玉,让万维链和社区全体成员、和整个行业配合进步。

言归正传,我们回到如何打造可进级智能合约这个话题上来。如图 4 所示,我们利用一个 Proxy 合约来存储数据,Proxy 合约利用 delegatecall 去挪用 Logical 合约 A。这样一来,Logical 合约 A 读取和写入的数据都是在 Proxy 合约内里。进级合约也变得简朴起来。陈设完 Logical 合约 B 后,只需要发一条生意业务到 Proxy,修改 Proxy 指向新的 Logical 合约 B 即可。此进级进程对 DApps 透明,DApps 完全感知不到合约举办了进级,于是完美办理了本文开头提到的两个痛点,既不要进级 DApps,也不需要举办数据迁移。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!