2021-05-31 14:16
本文的上篇《有了ChainLink,以太坊layer 2能为Filecoin引流吗?(上)》分析了提高以太坊可扩展性的关键点——交易记录中的数据项,而单笔合约创建交易代码体积超过所在区块整体体积一半大小,极大地影响了网络可扩展性。通过把IPFS作为以太坊的存储Layer 2,托管合约代码,只保留代码哈希(-99.9%),降低区块大小。将更多交易打包进区块,增加可扩展性。那么究竟该如何实现呢? Filecoin+ChainLink IPFS网络节点或Filecoin的检索矿工可以作为ChainLink节点提供高效、安全、稳定的外部数据服务,并获得相应奖励。通过将合约数据托管到一个去中心化的预言机网络连接的存储网络,在降低合约交易的数据量,提高以太坊可扩展性的同时,还能保证和以太坊相同的安全性。
一、切入
一般的合约交易的目的都是调用(call)目标合约账户中合约代码的函数(Function),而我们这次讨论的切入点点一类特殊的交易——合约创建交易。(如果对细节不感兴趣的同学这部分可以先跳过)
在一个合约被调用前,首先应该通过发送一笔交易被创建出来。这类交易与普通交易存在两点不同:
接收人。创建合约交易的接收方地址为固定的零地址——0x0;
合约代码。交易的“数据”项中的代码并不是合约代码,而是需要经过EVM执行计算后的结果。
文章的上半部分给出了一笔以太坊交易的数据结构,下面我们来具体解刨一下合约创建交易中的数据项:
{“data”: DeployCode+ ContractCode + auxdata}
Deploy code只在合约的初始化和部署时被执行,具体来说它的作用分为两点:
运行构造函数(可以分为constructorCode和constructorData),并设置初始存储变量(如contract owner);
将ContractCode部分复制并放入内存 ,将其返回给EVM作为合约代码。
ContractCode就是合约被创建部署后会被调用的合约代码;
Auxdata是加密指纹的源代码,用于验证。
注:Deploy code虽然只使用一次便被搁置了,但是由于区块中交易树的根哈希形成了存储在块头的一部分,因此有必要将合约创建数据保留作为交易的一部分。 为了更加直观的展示,我们创建了一个空合约C:
并将它部署在以太坊测试网:
// Deploy code(只使用一次,用于初始化)60606040523415600e57600080fd5b5b603680601c6000396000f300// Contract code(被调用)60606040525b600080fd00 注意,在区块链的一笔交易记录中,代码就是数据。而在合约执行或被调用时,数据就是代码。 二、合约代码体积
然而,一个正式部署在以太坊主网的合约是这个样子的……
来源链接:https://etherscan.io/tx/0x0c8bf04e67d62923f8c8ecc1409b68d42adfd6e2cf102f7d7c9141a1472e408e 这笔合约创建交易的代码部分共计28,224字节,而包含这笔交易的区块大小36,405字节,占比77.5%。
很显然,一笔合约创建交易占用了过多的区块空间,使得单个区块包含的交易数下降,很大程度上影响了以太坊的可扩展性! 三、IPFS来了
由此,我们想到可以把交易数据项中的代码存储在IPFS网络中,在数据项中只保留代码的哈希值。
如此一来,在上面的例子中代码被代码哈希取代,由36,405字节缩减为32字节,体积仅为原来的0.088%。可以为原来区块让出更多交易空间。
注:只要代码大于32字节,就可以把它替换成它哈希
然而,由于IPFS网络节点目前并不稳定,并且以太坊源码中并不包含托管合约的代码。因此,为了实现合约代码在链下高效、安全、稳定的托管。
四、Chainlink来了
IPFS网络节点或Filecoin的检索矿工可以作为ChainLink节点提供外部数据服务,并获得相应奖励。通过将合约数据托管到一个去中心化的预言机网络连接的存储网络,在降低合约交易的数据量、提高以太坊可扩展性的同时,还能保证和以太坊相同的安全性。
Chainlink工作流 结合Chainlink工作流,代码的托管流程流程如下:
合约的创建者将代码托管在IPFS网络中,并在User-SC合约中发布托管需求;
Chainlink网络节点中的预言机拍下托管需求,并作为IPFS或Filecoin节点存储代码或代码碎片;
所有Chainlink节点互相验证代码是否被保存在,如果验证通过则返回Yes代表代码被成功托管。否则失败节点罚没保证金;
发放代码托管奖励给Chainlink节点,保持代码托管的稳定和高效;
将代码哈希值放入交易的数据项,并提交至区块等待被矿工打包。
矿工打包时,只打包哈希值。由于存档节点仍然保存全部完整交易、状态和收据,随时可以验证。虽然在IPFS网络检索的时间会降低单个交易被打包进区块链的时间会增加,但是由于区块体积的下降,单个区块可以打包更多的交易,降低网络的拥挤。代码托管扩展了更大的存储和检索网络,结合哈希寻址的特性,帮助节点更快同步数据。 相应地,代码调用流程:
根据合约账户中代码的哈希在IPFS或Filecoin网络中检索相应代码。其中,deploy code不用下载,只用验证哈希。Contract code需要被下载至EVM,计算后返回状态。
综上,面对每月百万级的合约创建量,和占据区块大小过半的合约代码。通过将以太坊区块中体积较大的合约代码托管至链下,链上交易数据可以只保留代码哈希的方法给交易瘦身(99.9%)。托管工作由IPFS/Filecoin和Chainlink共同负责的,前者负责代码的存储和检索,后者(去中心化预言机)负责前者和以太坊区块链的交互,以及对存储网络节点发放奖励保持代码托管的高效和稳定。最终,达到增加单块的交易数,提高以太坊的可扩展性的目的。
引用:
https://github.com/ethereumbook/ethereumbook/blob/develop/06transactions.asciidoc
https://fullstacks.org/materials/ethereumbook/14_evm.html
https://ethereum.org/en/developers/docs/blocks/
https://ethereum.org/en/developers/docs/nodes-and-clients/
https://medium.com/@hayeah/diving-into-the-ethereum-vm-part-5-the-smart-contract-creation-process-cb7b6133b855
https://medium.com/paradigm-fund/chainlink-detailed-review-on-the-project-9dbd5e050974
尊敬的用户,因政策受限,中国大陆IP地址将禁止访问本网站,禁止注册和使用。如果您是中国大陆用户,请安全清退退出使用,如继续使用导致的风险和责任将完全由您独立承担,同时平台有权拒绝提供服务,谢谢您的理解,请接受并同意!