官方文档讲得不全也不是很清楚,特别是动态类型string。这里补充。

以太坊的智能合约ABI编码,官方文档和说明:https://solidity.readthedocs.io/en/v0.6.8/abi-spec.html

一个实用的工具,可直接生成ABI编码。
比如下图使用

这里侧重于solidity智能合约的构造方法的ABI编码构造。

普通方法的编码官网说得很清楚了。

构造函数的ABI编码由两部分构成,一是编译后的智能合约代码,而是构造函数的参数。

  1. 使用remix编译智能合约,复制编译后的十六进制码。


2. 我们智能合约的构造方法是:

constructor (uint256 _deadline, uint32 _reward, string memory _code) public{

现在的问题是,如果我们使用后台提交一个智能合约,需要提交该智能合约的构造函数的参数的值,但是,上面第一步的所复制的编码中不包含参数的值,因此,需要我们自己构造构造函数的值的ABI编码。

换一种说法描述上面的问题,如果使用remix部署我们上面的智能合约的话,因为只有一个构造函数,且是带参数的,因此deploy前需要填写这些参数的值,如下图。现在remix自动帮我们对参数进行ABI编码了,并将它追加在第一步所复制的数据的后面。如果我们自己在后台构造和部署智能合约,如何进行ABI编码构造方法的参数?

  1. 根据constructor (uint256 _deadline, uint32 _reward, string memory _code) ,假如取值(3, 2, “helloworld”),第一个参数是uint256,0x0000000000000000000000000000000000000000000000000000000000000003,使用0填充,uint32同理,追加到前面的数中。第三个是string,动态类型,因此先填下面这个固定的数,以60为结尾,长度为64。0000000000000000000000000000000000000000000000000000000000000060,变成:


为什么要追加这个"0000000…0060"呢?看下文。
4. 接下来追加string的长度(使用16进制表示)用0填充前面部分;再追加字符串的16进制表示,用0填充后面部分。

5. 因为0填充是以64长度为单位的,因此,当字符串的16进制编码长度操作了64长度,后面统一使用0填充。因此有

官网没有说清楚的是,为什么要追加上面的值0000000000000000000000000000000000000000000000000000000000000060。原因是,string类型是动态类型,长度不是固定的,因此,需要将string数据从哪里开始的这个信息编码进去,这个信息我们称为offset。现在的offset=60(16进制)=96(10进制),我们的字符串的长度表示是使用十进制的,又因为我们需要编码的参数为(uint256 _deadline, uint32 _reward, string memory _code),前面两个参数+offset,相当于3个数,每一个数的长度是一样的,因此 ** 每一个数的长度为96/3 = 32。** 这就是我们的结论。

根据上面这个结论,如果所编码的参数变为四个(uint256 _deadline, uint32 _reward, uint32 other, string memory _code),那么string前面的offset变为32*4 = 128(10进制) = 80 (16进制)。使用线上工具验证结果一致:

在solidity中的bytes类型也是动态类型,编码方式跟string类似。

谢谢

c++代码


// deadline, uint256; reward, uint32,
string appendParams_ABIEncode(string contractCode, unsigned long long deadline, unsigned int reward, string evalCode) {stringstream temp_time;temp_time << setfill('0') << setw(64) << hex << deadline;stringstream temp_reward;temp_reward << setfill('0') << setw(64) << hex << reward;stringstream temp_len;temp_len << setfill('0') << setw(64) << hex << evalCode.length();string code_hex = toHex(evalCode);int padding_num = code_hex.length() % 64;if (padding_num != 0) {padding_num = 64 - padding_num;}string padding = string(padding_num, '0');code_hex += padding;contractCode = contractCode + temp_time.str() + temp_reward.str() //后面是字符串,动态空间,所以要加这个,没在文档中找到这个定义。https://abi.hashex.org/+ string("0000000000000000000000000000000000000000000000000000000000000060") + temp_len.str() + code_hex;return contractCode;
}

调用:

const string compiledCode = "";
string requestData = appendParams_ABIEncode(compiledCode, 20200529124532, 20, "dsfasdjfkldsjkaflksdjfljsdflksdj");cout << requestData << endl;

以太坊智能合约函数参数ABI编码,动态类型string编码,函数参数的ABI编码, 含c++代码相关推荐

  1. 以太坊智能合约开发 | 一个资深技术专家的心路历程

    原创: 杨镇 一块链习社区 微信号yikuailianxishequ 本文作者杨镇, 以太坊黄皮书中译者,资深以太坊专家.曾独立中译了以太坊 Homestead 官方文档,Solidity 官方文档中 ...

  2. 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码

    本文使用区块链平台以太坊+智能合约实现一个区块链记账的功能,具体为: 借款人和贷款人以及数额被记录在区块链中.使用区块链地址来表示借款人或者贷款人. 若一个借款人多次向一个贷款人借钱,更新所有的数额之 ...

  3. truffle (ETH以太坊智能合约集成开发工具) 入门教程

    truffle (ETH以太坊智能合约集成开发工具) 入门教程 前言 在你了解区块链开发之前,你有必要了解区块链的一些基础知识,什么是DApp,DApp与传统app的区别, 什么是以太坊,以太坊中的智 ...

  4. 链乔教育在线|智能合约学习——以太坊智能合约学习笔记(四)

    链乔教育在线|智能合约学习--以太坊智能合约学习笔记(四) 本笔记记录的是使用matemask钱包连接以太坊私链,并编写一个基本的提币智能合约部署到以太坊私链上,进行调用. 一.浏览器安装metama ...

  5. 一起学:以太坊智能合约开发

    课程介绍 无论在科技圈还是金融圈,"区块链"俨然成了最热的词汇.2016年,区块链写入了国家的十三五规划中:2017年,央行基于区块链技术的数字票据交易平台测试成功:同年,工信部发 ...

  6. 以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践

    文章目录 一.初探以太访智能合约 1. remix小demo 2. 写智能合约用的编程语言 二.以太坊核心概念 1. 交易/事务( Transaction ) 2. 区块 3. 共识协议:工作量证明( ...

  7. 以太坊智能合约开发第七篇:智能合约与网页交互

    原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互 上一篇中,我们通过truffle开发框架快速编译部署了合约.本篇,我们将来介绍网页如何与智能合约进行交互. 编写网页 首先我们需要编写一个网页 ...

  8. 教程 | 以太坊智能合约编程之菜鸟教程

    教程 | 以太坊智能合约编程之菜鸟教程 译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下 ...

  9. 如何通过构建以太坊智能合约来销售商品

    如何通过构建以太坊智能合约来销售商品?这是个问题. 毫无疑问,比特币已经改变了我们看待和理解什么是金钱,价值以及最近由智能合约产生的所有权的方式.这很有趣,因为几乎每个人都听说过它或加密货币.来自许多 ...

  10. 以太坊智能合约安全 Dasp Top10

    译者:爱上平顶⼭ 来源:慢雾区 原文链接:https://www.dasp.co/ 这是分布式应⽤安全项⽬(或DASP)2018 年排名前10的漏洞第⼀次迭代 该项⽬是NCC集团的⼀项举措.这是⼀个开 ...

最新文章

  1. Android Sdcard 可用空间大小
  2. 【深度学习】449页pdf,FaceBook称其迈出“重塑AI科学的第一步”
  3. SharePoint 2007 URL地址快速一览表
  4. [CSS] 眼下最流行的五大CSS框架,你都知道么?
  5. 【转】mip-semi-fixed 走走又停停
  6. 目标检测如何计算召回率_计算机视觉目标检测的框架与过程
  7. 3K和3w的月薪的程序员,差别在哪里?
  8. php怎么写脚本,PHP脚本来写Daemon程序_php
  9. Vitamio不支持特性列表(本文会持续更新 2013-03-13)
  10. 苍狼敏捷软件开发团队建设指南-2-团队建设
  11. TM1640的驱动及代码
  12. 人到中年想学一门手艺自己创业好不好
  13. 职业规划-Android工程师
  14. 使用windows10系统怎么连接同一网络下别人共享的打印机
  15. 出口退税率6月20日准时出通知了!客户下单了!
  16. 锂矿降龙十八掌之时乘六龙:盛新锂能
  17. oracle数据如何导入pg库,【oracle数据库如何导入到pg库中】-其它论坛-ZOL中关村在线...
  18. 机械设计与计算机技术相关的论文,计算机技术机械制造论文-专业论文.doc 文档全文免费预览...
  19. android 切凹凸图,Android实现边缘凹凸的View
  20. 消息通知系统详解2---后端设计

热门文章

  1. logstsh xpack 认证_ElasticSearch Kibana 和Logstash 安装x-pack记录
  2. gc java root_一个两年Java程序员的面试总结
  3. 思科设置密码及一些基本操作
  4. 降低函数之间的耦合度
  5. PostgreSQL 数据库多列复合索引的字段顺序选择原理
  6. os.makedirs和os.mkdir 生成文件夹
  7. Oracle 免费的数据库--Database 快捷版 11g 安装使用与SOD框架对Oracle的CodeFirst支持...
  8. Jquery中获取表单的值并提交
  9. [shell] 一个printf 打印 8 进制码的问题
  10. 文件查询工具locate和find