本文的上篇《有了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
/End.
聲明:本文系IPFS原力區原創稿件,版權屬IPFS原力區所有,未經授權不得轉載,違者將依法追究責任。
提示:投資有風險,入市須謹慎,本文不作為投資理財的建議。