当前位置: 首页 > news >正文

网站建站平台公司超酷win8风格企业网站织梦模板

网站建站平台公司,超酷win8风格企业网站织梦模板,全网最低价业务网站,网络营销的发展历程Solidity 小白教程#xff1a;22. Call 这一讲我们将介绍如何利用 Call 调用合约。 Call call 是address类型的低级成员函数#xff0c;它用来与其他合约交互。它的返回值为**(bool, data)#xff0c;分别对应call**是否成功以及目标函数的返回值。 call是solidity官方推…Solidity 小白教程22. Call 这一讲我们将介绍如何利用 Call 调用合约。 Call call 是address类型的低级成员函数它用来与其他合约交互。它的返回值为**(bool, data)分别对应call**是否成功以及目标函数的返回值。 call是solidity官方推荐的通过触发fallback或receive函数发送ETH的方法。不推荐用call来调用另一个合约因为当你调用不安全合约的函数时你就把主动权交给了它。推荐的方法仍是声明合约变量后调用函数见第 21 讲调用其他合约当我们不知道对方合约的源代码或ABI就没法生成合约变量这时我们仍可以通过call调用对方合约的函数。 call的使用规则 call的使用规则如下 目标合约地址.call(二进制编码);其中二进制编码利用结构化编码函数abi.encodeWithSignature获得 abi.encodeWithSignature(函数签名, 逗号分隔的具体参数)函数签名为**“函数名逗号分隔的参数类型)”。例如abi.encodeWithSignature(“f(uint256,address)”, _x, _addr)。 另外call在调用合约时可以指定交易发送的ETH数额和gas** 目标合约地址.call{value:发送数额, gas:gas数额}(二进制编码);看起来有点复杂下面我们举个call应用的例子。 目标合约 我们先写一个简单的目标合约OtherContract并部署代码与第 19 讲中基本相同只是多了fallback函数。 contract OtherContract {uint256 private _x 0; // 状态变量x// 收到eth的事件记录amount和gasevent Log(uint amount, uint gas);fallback() external payable{}// 返回合约ETH余额function getBalance() view public returns(uint) {return address(this).balance;}// 可以调整状态变量_x的函数并且可以往合约转ETH (payable)function setX(uint256 x) external payable{_x x;// 如果转入ETH则释放Log事件if(msg.value 0){emit Log(msg.value, gasleft());}}// 读取xfunction getX() external view returns(uint x){x _x;} }这个合约包含一个状态变量x一个在收到ETH时触发的事件Log三个函数 getBalance(): 返回合约ETH余额。setX(): external payable函数可以设置x的值并向合约发送ETH。getX(): 读取x的值。 利用call调用目标合约 1. Response 事件 我们写一个Call合约来调用目标合约函数。首先定义一个Response事件输出call返回的success和data方便我们观察返回值。 // 定义Response事件输出call返回的结果success和data event Response(bool success, bytes data);2. 调用 setX 函数 我们定义callSetX函数来调用目标合约的setX()转入msg.value数额的ETH并释放Response事件输出success和data function callSetX(address payable _addr, uint256 x) public payable {// call setX()同时可以发送ETH(bool success, bytes memory data) _addr.call{value: msg.value}(abi.encodeWithSignature(setX(uint256), x));emit Response(success, data); //释放事件 }接下来我们调用callSetX把状态变量**_x改为 5参数为OtherContract地址和5**由于目标函数setX()没有返回值因此Response事件输出的data为0x也就是空。 3. 调用 getX 函数 下面我们调用getX()函数它将返回目标合约_x的值类型为uint256。我们可以利用abi.decode来解码call的返回值data并读出数值。 function callGetX(address _addr) external returns(uint256){// call getX()(bool success, bytes memory data) _addr.call(abi.encodeWithSignature(getX()));emit Response(success, data); //释放事件return abi.decode(data, (uint256)); }从Response事件的输出我们可以看到data为0x0000000000000000000000000000000000000000000000000000000000000005。而经过abi.decode最终返回值为5。 4. 调用不存在的函数 如果我们给call输入的函数不存在于目标合约那么目标合约的fallback函数会被触发。 function callNonExist(address _addr) external{// call getX()(bool success, bytes memory data) _addr.call(abi.encodeWithSignature(foo(uint256)));emit Response(success, data); //释放事件 }上面例子中我们call了不存在的foo函数。call仍能执行成功并返回success但其实调用的目标合约fallback函数。 总结 这一讲我们介绍了如何用call这一低级函数来调用其他合约。call不是调用合约的推荐方法因为不安全。但他能让我们在不知道源代码和ABI的情况下调用目标合约很有用。
http://www.hkea.cn/news/14484129/

相关文章:

  • 个人网站建设哪家快广州网站建设有哪些公司
  • 做自动发货网站网页设计代码含js
  • 新余做网站公司深圳十大电商巨头
  • 住房和城乡建设部执业资格注册中心网站建设企业网站企业网上银行登录官网下载
  • 网站后台首页模板学电子商务好找工作吗
  • 济宁网站建设服务兰州市官网
  • Paas网站建设wordpress可视化编辑主题
  • 如何分析他人网站流量c2c电子商务的特点
  • 呼和浩特住房和城乡建设部网站wordpress links插件
  • 基层组织建设部网站深圳建设公司网站
  • 网站建设展滔科技大厦学校网站建设存在的问题
  • 为自己家秘方做网站wordpress搜索代码制做
  • 网站做一些流量互换有道翻译网站 做翻译
  • 苏州哪里有做淘宝网站的什么叫app是什么意思
  • 公司做的网站计入什么wordpress主题绝对路径怎么修改
  • 网站如何做微信支付宝支付宝太原建站模板厂家
  • 免费空间的个人网站wordpress下载验证码
  • 山东外贸网站建设怎么样重庆建站网站建设平台
  • 建站公司用的开源系统厦门 网站制作
  • 绿色软件下载网站推荐一级a做爰片免费网站孕交视频教程
  • 为什么要做网站推广做分析图超牛的地图网站
  • 优秀的公司网站微信个人小程序
  • 手机图片网站源码wordpress手机版怎么注册
  • o2o手机网站源码南京电子商务网站开发公司
  • 深圳鲜花团购网站建设贵阳营销型网站建设
  • 淄博网站制作建设公司企业网站建设
  • 网站建设中faqs的意思怎么做代刷网网站app
  • aspnet网站开发实例项目成都广告设计制作公司
  • 网站建设案例实录应用商店下载安装正版最新版
  • 佛山网站优化软件windows网站模板