首页 > 其他分享 >【原创】合约编码方式解析

【原创】合约编码方式解析

时间:2022-10-26 15:14:04浏览次数:62  
标签:解析 字节 偏移量 参数 类型 bool 编码方式 合约 动态

例1:

函数定义:

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

实际调用:

baz(69, true)

编码为:

方法ID——0xcdcd77c0,方法 baz(uint32 x, bool y)的签名的ASCII格式的Kecak hash 的前4个字节:

0xcdcd77c0

第一个参数——69的hex形式uint32值,用0补位成32字节

0x0000000000000000000000000000000000000000000000000000000000000045

第二个参数——bool类型,0补位成32字节:

0x0000000000000000000000000000000000000000000000000000000000000001

合在一起则为:

0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001

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

实际调用:bar(["abc", "def"])

编码:

方法ID——0xfce353f6,方法 bar(bytes3[2])的签名的ASCII格式的Kecak hash 的前4个字节:

0xfce353f6

参数1的第一部分——”abc”,长度为3的字符串,左对齐【bytes3"abc"(左对齐)】:

0x6162630000000000000000000000000000000000000000000000000000000000

参数1的第二部分——”def”,长度为3的字符串,左对齐【bytes3"def"(左对齐)】

0x6465660000000000000000000000000000000000000000000000000000000000

合在一起则为:

0xfce353f661626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000

例3: function sam(bytes memory, bool, uint[] memory) public pure {}

实际调用:sam("dave",true,[1,2,3])

编码:

方法ID——0xa5643bf2,方法sam(bytes,bool,uint256[])的签名的ASCII格式的Kecak hash 的前4个字节:

0xa5643bf2

参数1(动态类型)的数据部分的位置——以字节为单位,从参数块的起始位置算起,本例则为0x60:

0x0000000000000000000000000000000000000000000000000000000000000060

参数2——true,bool类型

0x0000000000000000000000000000000000000000000000000000000000000001

参数3(动态类型)的数据部分的位置——以字节为单位,本例则为0xa0:

0x00000000000000000000000000000000000000000000000000000000000000a0

参数1(动态类型)的数据部分——以字节为单位,从参数块的起始位置算起,本例则为0x60:

合在一起则为:

0xfce353f661626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000

动态类型的使用

函数签名的来源:

%E5%90%88%E7%BA%A6%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%E8%A7%A3%E6%9E%90%2033e329f6f21f46dca68c62117d9b5d32/Untitled.png

例1:f(uint256,uint32[],bytes10,bytes)

分析:f(定长类型,动态类型,定长类型,动态类型)

调用:f(0x123, [0x456, 0x789], "1234567890", "Hello, world!")

→方法签名:sha3(f(uint256,uint32[],bytes10,bytes))=0x8be65246

→ 参数1,定长类型0x123:

  • 0x00000000000000000000000000000000000000000000000000000000000001230x123填充到 32 个字节)

→ 参数2,动态类型,偏移量:

0x0000000000000000000000000000000000000000000000000000000000000080(到第二个参数数据部分开始的偏移量,4*32(tohex(128)→80) 字节,正好是头部的大小

→参数3,定长类型 “1234567890”:(ASCII)

0x3132333435363738393000000000000000000000000000000000000000000000

→ 参数4,动态类型,

动态参数n的偏移量=

(动态参数1的数据起始位置的偏移量+动态参数1的数据大小)

+(动态参数2的数据起始位置的偏移量+动态参数2的数据大小)

+…

+(动态参数n-1的数据起始位置的偏移量+动态参数n-1的数据大小)

0x00000000000000000000000000000000000000000000000000000000000000e0 =432 + 332

→ 参数2(动态)的数据部分[0x456,0x789]:

数组元素的数量,2:

0x0000000000000000000000000000000000000000000000000000000000000002 第一个元素:

0x0000000000000000000000000000000000000000000000000000000000000456 第二个元素:

0x0000000000000000000000000000000000000000000000000000000000000789

→ 参数4(动态)的数据部分"Hello, world!”:

字符串的元素(byte-s)数,13:

0x000000000000000000000000000000000000000000000000000000000000000d 参数内容本身(补足32位):(ASCII码)

0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000

合一起为

0x8be65246 0000000000000000000000000000000000000000000000000000000000000123 0000000000000000000000000000000000000000000000000000000000000080 3132333435363738393000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000e0 0000000000000000000000000000000000000000000000000000000000000002 0000000000000000000000000000000000000000000000000000000000000456 0000000000000000000000000000000000000000000000000000000000000789 000000000000000000000000000000000000000000000000000000000000000d 48656c6c6f2c20776f726c642100000000000000000000000000000000000000

标签:解析,字节,偏移量,参数,类型,bool,编码方式,合约,动态
From: https://www.cnblogs.com/fRe-Bourne/p/16828440.html

相关文章

  • 中科三方技术再升级!解读智能云解析dns3大核心能力
       云解析技术通过配置多节点服务器解决了传统单节点服务器无可奈何的负载过高与洪水攻击等问题,然而飞速更迭的网络环境显然无法满足止步于这点小的技术跨越,新一代的智......
  • IFC文件解析
    IFC文件解析由buildingSMARTInternational设计以支持在AEC部门运行的各个应用程序之间的互操作性,IFC格式允许生成包括以下内容的文件:“简单”建筑构件(如墙壁、门......
  • 从源码中解析fabric区块数据结构(一)
    从源码中解析fabric区块数据结构(一)前言最近打算基于fabric-sdk-go实现hyperledgerfabric浏览器,其中最重要的一步就是解析fabric的上链区块。虽说fabric是Golang实现的,但......
  • 磨皮进阶之高低频全方位解析
    1.打开本节课的案例图片进行【复制】【快捷键Ctrl+J】,在【滤镜】中找到【高反差保留半径:10像素】效果进行点击,设置一下它的半径数值,具体如图示。2.将图层“类型”调整为......
  • 深度解析9种ScheduledThreadPoolExecutor的构造方法
    摘要:今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码。本文分享自华为云社区《​​深度解析ScheduledThreadPoolExecutor类的源代码​​》,作者:冰河。在之前的......
  • 背包问题常见解题策略与例题解析
    背包问题作为常见的一种Dp题目的变法多种多样然而只要你理解透了背包的做法和各种优化模型就显而易见了千万不要似懂非懂如果还有疑虑可以参考我的另一篇文章​​​背......
  • 45.限流Throttling及源码解析
    什么是限流?限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率假设有客户端(比如爬虫程序)短时间发起大量请......
  • getopts 解析Shell脚本命令行参数
      getopts命令是用来解析Shell脚本命令行参数的工具    #!/bin/bashset-eset-x##Globalvariablesworkspace=$PWD/$(dirname$0)readonlyworkspac......
  • 命令行参数解析getopt
      命令行解析参数 GNUC提供的函数getopt、getopt_long、getopt_long_only函数来解析命令行参数 https://github.com/tylov/STC/blob/master/docs/coption_api.m......
  • POJ 2588(解析几何+并查集)
    题目就是早从左到右的路注意输入的实数这题图画好就行,别像我一开始把图弄反就成从上开始找,若找到一个与下边界相邻的就无解,找到与左边相邻的记圆与左边界相交的下边的点(相当......