当前位置:   article > 正文

以太坊知识教程------智能合约(2)调用 delegatecall call send_address( ).call();

address( ).call();

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的区别

callsend
不修改智能合约的数据修改智能合约的数据
函数可以返回数据函数不能返回数据, 因为函数需要花时间执行
立刻执行需要几十秒才能执行完毕,返回值是transaction的hash
免费要花钱 钱!!!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/486991
推荐阅读
相关标签
  

闽ICP备14008679号