赞
踩
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的区别
call | send |
---|---|
不修改智能合约的数据 | 修改智能合约的数据 |
函数可以返回数据 | 函数不能返回数据, 因为函数需要花时间执行 |
立刻执行 | 需要几十秒才能执行完毕,返回值是transaction的hash |
免费 | 要花钱 钱!!! |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。