以太坊知识教程------智能合约(2)调用 delegatecall call send
1. 函數(shù)調(diào)用call(…)
<address>.call(…)
可以接受任何長(zhǎng)度、任何類型的參數(shù),每個(gè)參數(shù)將被填充到 32 字節(jié)并拼接在一起 。 但有一種例外情況,當(dāng)?shù)谝粋€(gè)參數(shù)的長(zhǎng)度恰好是 4 字節(jié)時(shí),該參數(shù)不會(huì)被打包成 32 字節(jié),而是被作為指定函數(shù)的簽名 。
eg. 第一個(gè)參數(shù) bytes4(keccak256(”fun(uint256)”))為長(zhǎng)度 4字節(jié)的函數(shù)簽名,表示調(diào)用一個(gè)函數(shù)簽名為 fun(unit256)的函數(shù), 4 則是實(shí)際傳給 fun 函數(shù)的參數(shù):
address nameReg = Ox72ba7d8e73fe8eb666ea66babc8116a4lbfb10e2;
nameReg.call(bytes4(keccak256(“fun(uint256)”)), 4);
函數(shù)簽名使用基本類型的典型格式定義,如果有多個(gè)參數(shù)要使用逗號(hào)隔開,并且要去掉表達(dá)式中的所有空格 。
2. 代理調(diào)用( delegate call )
與函數(shù)調(diào)用相同,它將目標(biāo)地址的代碼加載到發(fā)起調(diào)用的合約上下文中來執(zhí)行,卻不會(huì)改變當(dāng)前的上下文環(huán)境,包括msg.sender 和 msg.value 、當(dāng)前賬戶、存儲(chǔ)、內(nèi)存等,這使得智能合約可以在運(yùn)行時(shí)動(dòng)態(tài)地從其他地址加載代碼。
例如: A 調(diào)用 B, B 委托調(diào)用 c,此時(shí) msg.sender 為 A 。 而如果是普通調(diào)用,則 msg.sender 為 B 。
這意味著一個(gè)合約在運(yùn)行時(shí)可以從另外一個(gè)地址動(dòng)態(tài)加載代碼 。存儲(chǔ)當(dāng)前地址和余額都指向發(fā)起調(diào)用的合約,只有代碼是從被調(diào)用地址獲取的。這使得Solidity 可以實(shí)現(xiàn)庫(kù)能力。
3. 函數(shù)調(diào)用 send transaction
函數(shù)調(diào)用call和send的區(qū)別
| 不修改智能合約的數(shù)據(jù) | 修改智能合約的數(shù)據(jù) |
| 函數(shù)可以返回?cái)?shù)據(jù) | 函數(shù)不能返回?cái)?shù)據(jù), 因?yàn)楹瘮?shù)需要花時(shí)間執(zhí)行 |
| 立刻執(zhí)行 | 需要幾十秒才能執(zhí)行完畢,返回值是transaction的hash |
| 免費(fèi) | 要花錢 錢!!! |
總結(jié)
以上是生活随笔為你收集整理的以太坊知识教程------智能合约(2)调用 delegatecall call send的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊知识教程------智能合约(2)
- 下一篇: 以太坊知识教程------智能合约(3)