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