目录

1. 调用已部署的智能合约

相关截图来自:

1.1. ABI是payload编码的依据

ABI,应用二进制接口(Application Binary Interface)。它是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。根据它可以得到函数签名编码,同样根据它以及实际参数得到参数编码,两部分的字节序列拼接而得payload。

1.2. 函数签名编码

函数签名编码又叫函数选择器,是函数签名的 Keccak(SHA-3)哈希的前4字节。函数签名:函数名称加上由括号括起来的参数类型列表,参数类型间由一个逗号分隔开,且没有空格。函数的返回类型并不是这个签名的一部分。

1.3. 参数编码

参数类型可以分为:

l 基础类型,如uint、int、address、uint、int、bool、fixedx、ufixedx、fixed、ufixed、bytes、function。

l 定长数组类型:[M]。

l 非定长数组类型:bytes、string(UTF-8)、[]。

以下类型被称为“动态”:

l bytes

l string

l 任意类型 T 的变长数组T[]

l 任意动态类型 T 的定长数组T[k](k >= 0)

l 由动态的 Ti (1 <= i <= k)构成的元组 (T1,...,Tk)

所有其他类型都被称为“静态”。

不同类型的参数编码方式不一样,下面以实际例子讲解。

1.4. payload编码原理

合约如下:

pragma solidity ^0.4.16;

contract Foo {

function baz(uint32 x, bool y) public pure returns (bool r) { r = x > 32 || y; }

function bar(bytes3[2]) public pure {}

function sam(bytes, bool, uint[]) public pure {}

}

想用 69 和true做参数调用baz,我们总共需要传送68字节,可以分解为:

l 0xcdcd77c0:方法ID。这源自ASCII格式的baz(uint32,bool)签名的Keccak哈希的前4字节。

l 0x0000000000000000000000000000000000000000000000000000000000000045:第一个参数,一个被用0值字节补充到32字节的uint32值69。

l 0x0000000000000000000000000000000000000000000000000000000000000001:第二个参数,一个被用0值字节补充到32字节的boolean值true。

合起来就是:

0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001

如它返回 false,那么它的输出将是一个字节数组,一个bool值:

0x0000000000000000000000000000000000000000000000000000000000000000

想用 ["abc", "def"] 做参数调用bar,我们总共需要传送68字节,可以分解为:

l 0xfce353f6:方法ID。源自bar(bytes3[2])的签名。

l 0x6162630000000000000000000000000000000000000000000000000000000000:第一个参数的第一部分,一个bytes3值"abc"(左对齐)。

l 0x6465660000000000000000000000000000000000000000000000000000000000:第一个参数的第二部分,一个bytes3值"def"(左对齐)。

合起来就是:

0xfce353f661626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000

想用 "dave"、true和[1,2,3]作为参数调用sam,我们总共需要传送292字节,可以分解为:

l 0xa5643bf2:方法ID。源自sam(bytes,bool,uint256[])的签名。注意,uint被替换为了它的权威代表uint256。

l 0x0000000000000000000000000000000000000000000000000000000000000060:第一个参数(动态类型)的数据部分的位置,即从参数编码块开始位置算起的字节数。在这里,是0x60。

l 0x0000000000000000000000000000000000000000000000000000000000000001:第二个参数:boolean的true。

l 0x00000000000000000000000000000000000000000000000000000000000000a0:第三个参数(动态类型)的数据部分的位置,由字节数计量。在这里,是0xa0。

l 0x0000000000000000000000000000000000000000000000000000000000000004:第一个参数的数据部分,以字节数组的元素个数作为开始,在这里,是4。

l 0x6461766500000000000000000000000000000000000000000000000000000000:第一个参数的内容:"dave"的UTF-8编码(在这里等同于ASCII编码),并在右侧(低位)用0值字节补充到32字节。

l 0x0000000000000000000000000000000000000000000000000000000000000003:第三个参数的数据部分,以数组的元素个数作为开始,在这里,是3。

l 0x0000000000000000000000000000000000000000000000000000000000000001:第三个参数的第一个数组元素。

l 0x0000000000000000000000000000000000000000000000000000000000000002:第三个参数的第二个数组元素。

l 0x0000000000000000000000000000000000000000000000000000000000000003:第三个参数的第三个数组元素。

合起来就是:

0xa5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003

实际上,函数返回值和事件的参数也会被用同样的方式进行编码。

1.5. ABI的JSON表示

一个描述函数的ABI的JSON表示含如下构成:

当源码被编译后,就能得到函数的ABI,如Remix上的情况如下:

1.6. EthereumJ内置的payload编码工具

Java版Ethereum已经实现了编码功能的内置:

可以看到,内置的功能可以直接输入ABI的JSON表示,然后给出实际的参数就可以得到整个的payload。

1.7. 合约执行过程及结果解析

合约执行过程分析:

如果data小于4字节,则返回程序结果Return为空,并置为REVERT。

加载data,取出前4字节,与合约的所有方法的4字节码编码对比,匹配上则跳转到指定方法的入口并执行。然后执行,如果有返回值,则得到后放到程序结果的Return中。

Abi.Function的decodeResult方法就可以解析返回的Return数据,得到的是List>。

1.8. 参考资料

以太坊智能合约Java_以太坊:调用已部署的智能合约相关推荐

  1. 在geth客户端调用已部署的智能合约

    什么是合约? 合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址. 合约账户能够在彼此之间传递信息,进行图灵完备的运算.合约依靠被称作以太坊虚拟机(EVM) 字节代码(以太坊 ...

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

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

  3. 以太坊:在合约里调用指定地址的另一已部署合约

    转载请注明出处:https://www.cnblogs.com/zhizaixingzou/p/10122371.html 目录 1. 在合约里调用指定地址的另一已部署合约 后面的讲解已在下面的在线I ...

  4. 以太坊-入门基础(以太坊黄皮书学习)

    文章目录 一.什么是以太坊黄皮书 二.以太坊黄皮书 1. 引言 2. 区块链范式 3. 约定 4. 区块.状态和交易 世界状态 账户状态 交易 区块 总结 5. Gas 及其支付 gasPrice 和 ...

  5. 【智能合约】编写复杂业务场景下的智能合约——可升级的智能合约设计模式(附Demo)

    可升级的以太坊智能合约设计模式 目录 可升级的以太坊智能合约设计模式 智能合约的现状 智能合约的局限 智能合约目前的发展方向 如何利用智能合约实现复杂的业务场景 智能合约设计模式的技术点 智能合约设计 ...

  6. 以太坊智能合约开发(四):Solidity转账智能合约实验

    以太坊智能合约开发(四):Solidity转账智能合约实验 1 合约编写 2 在线调试 1 合约编写 编写一个分布式转账智能合约,部署合约的人为合约管理员,只有管理员可以为其他用户发放代币,其他用户之 ...

  7. 挪动以太坊:比特币现金的新功能使其成为智能合约竞争者

    华尔街技术专家对比特币现金智能合约和以太坊智能合约的看法 ​​ 智能合约.它被称为Blockchain 2.0.(Blockchain 1.0是现金)它拥有一个新世界的全部承诺,一个新的数字前沿.在一 ...

  8. 使用remix和matemask部署智能合约到以太坊测试网络

    目录 1. 平台准备 1.1 网页版remix 1.2 Chrome浏览器插件metamask 2. 部署智能合约 1. 平台准备 1.1 网页版remix 进入网址 https://remix.et ...

  9. 以太坊转账参数java_【ETH钱包开发04】web3j转账ERC-20 Token

    在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账. [ETH钱包开发03]web3j转账ETH ERC-20 Token转账的2种方式 1.直接用web3j的API 2.jav ...

最新文章

  1. OpenCV学习笔记2---命名规约
  2. FM:大熊猫的肠道菌群可能并没有特化出发酵纤维素的能力
  3. 同步手绘板——将View的内容映射成Bitmap转图片导出
  4. C语言程序可以没有main函数
  5. Angular 项目里的 tsconfig.json
  6. 计算机常用控温算法,常用温度控制方法原理 -解决方案-华强电子网
  7. (十)java多线程之CountDownLatch
  8. Cocos2d-x学习之---关于CCScrollView
  9. PHP获取6位数随机数,获取redis里面不存在的6位随机数(设置24小时过时)
  10. iOS开发之段落文字排版的属性与细节
  11. Google Chrome 初试手记
  12. stm32呼吸灯c语言程序,基于stm32的PWM输出呼吸灯(包括stm32呼吸灯代码)
  13. 2017第八届CSTQB国际软件测试高峰论坛圆满召开
  14. 华为云主机被植入挖矿,主机变肉鸡破解实录。
  15. 抖音书单号怎么取名,抖音书单号大概多久能起来
  16. 什么是透明背景格式logo?Logo白底变透明工具测评
  17. answer的汉语_answers怎么读(answers中文是什么意思)
  18. 5分钟通过Sails.js从零开始开发RESTful API
  19. 3d智慧城市线上3d模型展示可视化平台
  20. 我国互联网遭境外网络攻击

热门文章

  1. 95-50-020-java.nio.channels-NIO-NIO概览
  2. 60-150-044-使用-Sink-Flink自定义RetractStreamTableSink
  3. spark学习-JavaRDD注册成表然后用SparkSQL查询
  4. Git的使用教程(二)
  5. 双显卡只用独显好吗_双动力洗衣机好吗
  6. 手写一个网关服务,理解更透彻!
  7. SpringBoot 接口快速开发神器(接口可视化界面实现)
  8. Java类加载过程梳理,一篇搞定
  9. Spring全家桶,永远滴神!
  10. 自定义控件常用方法总结