前言
前段时间,PolyNetwork被盗事件的一个小插曲,一地址向黑客地址转账在inputdata中告知其USDT已被冻结,不要使用USDT,黑客知晓后向该地址转账13.37ETH。
事后很多人便通过inputData在区块链上“聊天”向黑客“索要”虚拟货币,那么我们经常在区块链浏览器中看到的inputData到底是什么?知道创宇区块链安全实验室为您解答。
Inputdata
在以太坊协议中,当交易为合约创建时,inputdata是账户初始化程序的EVM代码;
而当交易为消息调用时,inputdata是合约函数调用数据。
正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址_to和你要转账的数量_amount,这些基本信息都包含在inputdata里面。
我们通过一个调用合约的转账交易具体分析,来理解消息调用时inputdata的结构。
解析形式:
原始形式:
DOGE未平仓合约已飙升至62亿:金色财经报道,根据Trading View跟踪数据显示,DOGE周二上涨10%,创下4月3日以来的最大单日涨幅。根据Coinglass追踪的数据,名义未平仓合约(即活跃永续期货合约数量锁定的美元价值)自4月19日以来首次突破5亿美元大关。两周内增加了一倍多。截止目前,DOGE未平仓合约已飙升至62亿,接近4月8日达到的高点64.3亿。未平仓合约增加和价格上涨相结合表明有新资金涌入市场。此外,截至发稿时,未平仓合约加权资金利率已降至零,表明看涨多头头寸和看跌空头头寸之间存在平衡。[2023/7/26 15:59:44]
我们将原始的inputdata分为三个部分进行分析:
0xa9059cbb:函数标识符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一个参数为address即你要转账的地址,并补位到32字节即64个16进制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二个参数为value即你要转账的数量,并补位到32字节即64个16进制字符
通过对比分析我们可以发现inputdata的基本结构为函数标识符+参数。
函数标识符
Web3社交应用Phaver推出Web3社会信誉系统Phaver Cred:5月18日消息,基于Lens Protocol上的Web3社交应用Phaver宣布推出Web3社会信誉系统Phaver Cred,用户在将其NFT连接到Phaver之后可以提升信誉并获得每日收益,每个资产只能连接到一个账户。Phaver表示,任何人都可以赚取Phaver积分(Points),但只有Cred获得2级或更高级别的用户才有资格将其兑换为代币。[2023/5/18 15:10:59]
这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的Keccak哈希的前4字节。
我们可以通过代码bytess4(keccake256("transfer(adddress,uint256)"))或者在线工具获取这种函数签名。
下图可以看出加密结果的前四个字节(a9059cbb)跟inputdata中函数标识符一致。
这里之所以要将函数签名截断到四个字节是考虑到Gas成本问题。
在一笔交易中0字节需要支付4gas,而非0字节需要68gas也就是0字节的17倍。
在SHA-3加密中生成的32字节随机字符串更倾向于多的非0字节,所以大概成本是32x68=2176gas,而截断成本大概为4x68=272gas,可见截断到四个字节能够节省约8倍的gas费。
DWF Labs相关地址将15.1万亿枚LADYS存入MEXC、Huobi等交易平台:5月16日消息,据Lookonchain监测,DWF Labs相关地址已将15.1万亿枚LADYS(约合210万美元)转移到交易平台MEXC、Huobi、Bybit和Gate。这些LADYS持仓的购买成本是5.3枚ETH(约合9,903美元),如果全部卖掉,利润将超过200万美元。[2023/5/16 15:05:14]
而函数标识符的作用是指定调用哪一个函数,在同一个合约中两个不同函数的SHA-3签名的前4字节相同的概率是十分小的,所以截断到四个字节实际不会影响函数调用。
参数
在evm执行字节码的约定中,静态类型左补齐零至64长度,而动态类型则是右补齐零至64长度。
归纳下常见的静态类型:uint,bool,Address,bytes,动态数组类型:bytes,string,address,bytes32.....
我们通过pyethereum的ABI编码函数来研究不同数据类型的编码方式。
静态类型
先导入encode_abi函数
importrlpfromethereum.abiimportencode_abi
我们以函数transfer(address,uint256)为例
>encode_abi(,
).hex()
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
约2331万美元BTC转入Gate:金色财经报道,1000枚BTC于今日13:20从未知钱包转入Gate,价值约2331万美元。[2023/2/4 11:47:35]
0000000000000000000000000000000000000000000000000000000000000001
对于小于32字节的定长数组会被自动填充到32字节:
>encode_abi("],).hex()
//自动填充0
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
动态类型
动态类型编码要稍微复杂一些,需要先计算偏移量进行占位处理,我们通过一个简单的例子来具体说明。
>encode_abi(","uint256","uint256"],
,,]
).hex()
//参数1的偏移量:32*3=96十六进制0x600000000000000000000000000000000000000000000000000000000000000060
Yuga Labs元宇宙项目Otherside虚拟地块NFT交易额突破9亿美元:5月18日消息,据 NFTGo.io 数据显示,Yuga Labs 元宇宙项目 Otherside 虚拟地块 Otherdeed NFT 交易额突已破 9 亿美元,截止目前已达 9.09 亿美元,市值约为 6.51 亿美元。当前 Otherdeed NFT 地板价为 3.1 ETH,24 小时涨幅 8.76%。[2022/5/18 3:24:04]
//参数2的偏移量=参数1偏移量+参数1数据部分长度=96+32*4=224十六进制0xE000000000000000000000000000000000000000000000000000000000000000e0
//参数3的偏移量=参数2偏移量+参数2数据部分长度=224+32*4=352十六进制0x1600000000000000000000000000000000000000000000000000000000000000160
//偏移量0x60位置开始传入参数1的数据
0000000000000000000000000000000000000000000000000000000000000003//元素个
00000000000000000000000000000000000000000000000000000000000000a1//第一个数组元素
00000000000000000000000000000000000000000000000000000000000000a2//第二个数组元素
00000000000000000000000000000000000000000000000000000000000000a3//第三个数组元素
//0xe0位置。参数2的数据
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000b1
00000000000000000000000000000000000000000000000000000000000000b2
00000000000000000000000000000000000000000000000000000000000000b3
//0x160位置。参数3的数据
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000c1
00000000000000000000000000000000000000000000000000000000000000c2
00000000000000000000000000000000000000000000000000000000000000c3
短地址攻击
经过前面的分析当静态类型如address长度不足32字节时EVM会根据规则将长度补齐到32字节,如果当转账的地址以00结尾,如0x641988625108585185752230bde001b3ebd0fc00,转账时将地址后面的两个零去掉,EVM依然会认为address_to是32位的,所以它会从_value的高位取0来补充,amount的位数会多两位也就是会乘以256。
攻击过程如下:
将恶意转账地址最后一个字节的0去掉
函数标识符:a9059cbb
转账地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc
转账金额:
00000000000000000000000000000000000000000000000000000000000000001
由于EVM的补位规则,解析结果为:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100
我们分解后发现,转账金额已经多了两位也就是多了一个字节,即为原来转账的256倍
函数标识符:a9059cbb
转账地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc00
转账金额:
00000000000000000000000000000000000000000000000000000000000000100
如何在inputdata附着信息
在以太坊中直接进行转账交易的inputdata字段默认是没有内容的,但是我们可以通过设置钱包实现文章开头的“聊天功能”。
我们以MetaMask钱包为例展示如何通过转账在inputdata字段附着一些额外的信息。
1、首先我们需要打开钱包高级选项的显示十六进制数据开关
2、在转账时将你要附着的信息通过十六进制编码后填入下方十六进制数据中,记得在开头加上0x然后进行转账
3、转账成功后在etherscan中就能够看到附着信息
总结
我们能够通过交易中的inputdata将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。
前言:本文总结了一般大众可能好奇的关于NFT的具体概念、受认可程度、交易方式、手续费、制作方法等5个疑问.
1900/1/1 0:00:00印度总理NarendraModi周六在印度主持了一场关于Crypto的会议。此次会议的与会人员包括印度储备银行、财政部和内政部以及来自全国各地的专家.
1900/1/1 0:00:00项目全称:MarsInu项目标签:NFT、币安智能链生态项目官网:https://marsinu.com/信用评分:评分为3.
1900/1/1 0:00:00作者|五火球教主出品|白话区块链在《多链宇宙大拆解·上篇》中,我们讲了BTC、ETH,以及ETH的一众Layer2们,随后在《多链宇宙大拆解·中篇》中,我们说了这两年最火的几大公链.
1900/1/1 0:00:00Polkadot生态研究院出品,必属精品波卡一周观察,是我们针对波卡整个生态在上一周所发生的事情的一个梳理,同时也会以白话的形式分享一些我们对这些事件的观察.
1900/1/1 0:00:00潮水袭来,潮水退出,周而复始,我们告别二零二一,迎来二零二二。1比特币历史新高美CPI近40年新高在美国全面开闸放水的背景下,比特币价格11月10日创下69000美金的历史新高.
1900/1/1 0:00:00