维卡币官网-数字货币合约招商_比特币价格今日行情_虚拟货币交易平台

维卡币官网

万维大讲堂 | 怎么样在Wanchain币上塑造可升级智能合约

写在前面

图 2 call步骤图

Wanchain作为一条着力塑造分布式金融基础设施的跨链公链,在跨链协议、跨链标准拟定、PoS机制研究、随机数生成、dApp应用场景、行业解决方法、合约设计模式等很多方面,Wanchain币团队有着扎实的理论基础和丰富的实践经验。秉承兼容并包的区块链精神,Wanchain团队开办“万维区块链常识大讲堂”栏目,凭着团队的技术积淀,由团队技术大咖亲自执笔,按期为整个行业贡献有趣、有价值、有意义的内容输出,为业内业外的一般用户和专业用户抛砖引玉,让Wanchain币和社区全体成员、和整个行业一同进步。

万维区块链常识大讲堂之智能合约篇:怎么样在Wanchain上塑造可升级智能合约?由Wanchain技术团队研发总监Gabriel Guo为大伙徐徐道来怎么样创建数据和逻辑离别、数据结构可扩展的可升级智能合约。

Wanchain的智能合约用的是solipty语言,用过solipty语言的人都了解,假如智能合约有bug或者需要扩展新的特质,将是一个巨大的挑战。网站源码本身的修改技术员都能搞定,最大的挑战是solipty每次部署合约后,合约地址都会改变,如此就面临不少棘手的问题:

所有些用到了该合约的去中心化应用都需要修改合约地址来适配新的合约

链上合约里的数据要迁移到新的合约里面,通常会对旧合约做网站快照,然后把数据导入到新合约中。这种方法的不足之处在于工作量大,需要脚本扫链,比较容易出错。一旦出错,后果可能是没办法承担的

因此,技术员就自然而然的考虑能否塑造一种可升级的智能合约构造呢?答案是一定的,本文将详细讲解怎么样做到这一点。

要塑造可升级的智能合约构造,就需要做到数据和逻辑离别。数据保存在一个合约里面,该合约维持稳定,防止升级;逻辑保存在另外一个合约里面,该合约可以升级。毕竟每次升级都是修改的代码逻辑。如此的设计,正好完美的解决了上面提到的第二个痛点。

图 3 delegatecall步骤图

如图 2所示,是典的call调用,重点关注两个合约的上下文。Caller合约的msg.sender和msg.alue都是用户(EOA)发送的买卖中的数据。Target合约的上下文变了,msg.sender和msg.alue变成了Caller合约的买卖数据,不再是用户(EOA)的了。这个还是非常不错理解的。

大家再看图 3,Caller合约跟图 2没差别,但Target的msg.sender和msg.alue居然还是用户(EOA)的买卖数据,非常神奇。这就是delegatecall跟call的本质不同,delegatecall并不会切换合约的上下文,也就是Target合约用的是Caller的存储空间,修改的也是Caller的存储空间。

图 4 加盟合约和逻辑合约示意图

言归正传,大家回到怎么样塑造可升级智能合约这个话题上来。如图 4所示,大家用一个Proxy合约来存储数据,Proxy合约用delegatecall去调用Logical合约A。如此一来,Logical合约A读取和写入的数据都是在Proxy合约里面。升级合约也变得容易起来。部署完Logical合约B后,仅需发一条买卖到Proxy,修改Proxy指向新的Logical合约B即可。此升级过程对去中心化应用透明,去中心化应用完全感知不到合约进行了升级,于是完美解决了本文开头提到的两个痛点,既不要升级去中心化应用,也无需进行数据迁移。

这时,挑剔的技术员可能会提出新的挑战,假如要新增特质,需要修改数据结构如何解决?上面说到的只不过修改逻辑,而日常修改数据结构也是非常容易见到的需要。这个也是有方法解决的,就是在设计数据结构的时候全部用Key-Value的Map数据结构,这种结构有哪些好处是原则上可以无限扩展。当需要保存新的数据,只须重新概念一个新的Key就好了。如此做的代价就是代码的可读性降低不少,本来一些可以用结构体比较容易做到的,却要生生拆成Key-Value的Map数据。所以我的建议是可以用折中策略,就是开发第一版的时候还是用容易见到的数据结构,可读性好,开发周期也短一些。但同时概念一些容易见到类的Key-Value的Map用于扩展。当升级合约的时候需要新增数据,就用这部分预留好的Map去扩展,毕竟如此的需要并非那样容易见到。

最后需要提醒一下技术员,用Proxy-Delegate的构造达成可升级智能合约,是有约束条件的,就是Proxy和Delegate合约的状况变量的概念要维持一致,顺序也要维持一致。切记切记,不然出现问题是非常难调试的。

到此为止,相信技术员已经知晓怎么样去设计我们的可升级solipty智能合约了。但还要实践才能领悟得更深刻。Wanchain的柚子币跨链智能合约用的就是Proxy-Delegate构造,可以作为非常不错的参考。

pragma solipty ^0.4.24;
contract Proxy {address public owner;eent Upgraded;address internal _implementation;
constructor public {owner = msg.sender;}
mopfier onlyOwner { require; _;}function implementation public iew returns {return _implementation;}
function upgradeTo public onlyOwner {require, "Cannot upgrade to inalid address");require;_implementation = impl;emit Upgraded;}
function external payable {address _impl = _implementation;require, "implementation contract not set");
as百度竞价推广bly {let ptr := mloadcalldatacopylet result := delegatecalllet size := returndatasizereturndatacopy
switch resultcase 0 { reert }default { return }}}}

关于Wanchain

Wanchain,中文名Wanchain币,聚焦于跨链机制的研发,通过构建具备跨链能力的分布式金融基础设施来达成万链互联的宏伟目的。截至现在,Wanchain已成功跨链集成BTC、ETH、柚子币与ETH和柚子币上的生态代币,并设计提出了通用跨链框架T-Bridge,旨在达成资产和数据在不同公链和网盟链间的自由流转。在共识机制方面,Wanchain设计并上线了拥有完整委托机制的实用PoS共识协议,即星系共识。不论是跨链机制,还是共识协议,Wanchain一直处于行业的领先地方。

扫描关注公众号Wanchain币,获得更多信息

图 1 合约数据和逻辑离别示意图

如图 1所示,Data合约和Logical合约A开发完成,部署到链上,Logical合约A需要用到的数据都通过合约间调用存储在Data合约里面。两个合约形成了一个整体服务。去中心化应用仅需调用Logical合约A的ABI(应用程序二进制接口)。忽然有一天发现了紧急的bug,于是修复完bug后,部署Logical合约B到链上,修改去中心化应用指向新的Logical合约B,从而达到了升级合约的目的,完美的防止了数据的迁移。

有细心的技术员这个时候会提出质疑,上述办法虽然能解决数据迁移的痛点,但要修改所有用该智能合约的去中心化应用,还是很麻烦。那样不要着急,下面介绍一种更高级的数据和逻辑离别的办法,同时解决上述的两个痛点。

在开始介绍新的办法之前,要引入一种solipty里面的定义:delegate call。Solipty提供了几种合约之间调用的办法,最常见的是call,大多数合约都是用的call。目前说的是不太容易见到的delegatecall,这里只不过容易的说明一下call和delegatecall有什么区别,详细的介绍请大伙自行Google。

我们的缺点麻烦您能提出,谢谢支持!