前言
前段时间,PolyNetwork被盗事件的一个小插曲,一地址向黑客地址转账在inputdata中告知其USDT已被冻结,不要使用USDT,黑客知晓后向该地址转账13.37ETH。
事后很多人便通过inputData在区块链上“聊天”向黑客“索要”虚拟货币,那么我们经常在区块链浏览器中看到的inputData到底是什么?知道创宇区块链安全实验室为您解答。
Inputdata
在以太坊协议中,当交易为合约创建时,inputdata是账户初始化程序的EVM代码;
而当交易为消息调用时,inputdata是合约函数调用数据。
正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址_to和你要转账的数量_amount,这些基本信息都包含在inputdata里面。
我们通过一个调用合约的转账交易具体分析,来理解消息调用时inputdata的结构。
解析形式:
原始形式:
瑞士比特币平台Relai完成450万美元融资,ego death capital领投:金色财经报道,瑞士比特币平台Relai宣布完成450万美元新一轮融资,ego death capital领投,Timechain、Cabrit Capital、Lightning Ventures、Redalpine、Fulgur Ventures参投。
自2020年首次进行种子轮融资以来,Relai迄今融资总金额已达到1180万美元。Relai平台允许散户投资者买卖比特币且无需进行额外注册、验证,也没有存款限制,该平台还支持投资者通过非托管比特币钱包完全控制自己的资金。Relai计划利用新资金升级到比特币闪电网络并推出白标产品。(Tech.eu)[2023/3/7 12:46:36]
我们将原始的inputdata分为三个部分进行分析:
0xa9059cbb:函数标识符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一个参数为address即你要转账的地址,并补位到32字节即64个16进制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二个参数为value即你要转账的数量,并补位到32字节即64个16进制字符
Zebec生态成立Zebec Labs,并推出1000万美元生态基金以孵化优质应用:2月24日消息,流支付生态Zebec成立Zebec Labs,同时推出生态孵化机构,以推动Zebec 生态以及Web3生态的长远发展,目前推出了价值1000万美元的生态基金用于孵化。
Zebec生态背靠一线平台资源,提供技术与市场的支持,提供Grant以及流动性激励政策等各类激励。优质项目有机会获得由Zebec Labs的直接投资与其他头部资本的跟投。[2023/2/24 12:26:52]
通过对比分析我们可以发现inputdata的基本结构为函数标识符+参数。
函数标识符
这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的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费。
数据:当前DeFi协议总锁仓量达576.47亿美元:11月14日消息,DeFiLama链上数据显示,当前DeFi项目总锁仓量(TVL)为576.47亿美元。锁仓量资产排名前五(美元):
Maker(67.53亿+0.13%)
Curve(65.48亿-0.02%)
Aave(46.04亿-1%)
WBTC(39.82亿-1.84%)
Uniswap V3(36.6亿-0.31%)[2022/11/14 13:01:57]
而函数标识符的作用是指定调用哪一个函数,在同一个合约中两个不同函数的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()
SEC主席:可以调整披露规则以适应加密货币公司:金色财经消息,美国证券交易委员会(SEC)主席Gary Gensler周四表示,SEC可以调整披露规则以适应加密货币公司,从而为该机构未来的规则制定提供新的思路。他说,“我已经对行业、借贷平台、交易平台说过,进来和我们谈谈。我们确实拥有来自国会的强大权力,也可以使用我们的豁免权,以便我们可以调整投资者保护,甚至可以调整披露的内容,因为对于发行股票的人来说,并非所有披露都与加密代币相同。但我要指出,我们对资产支持证券的披露与我们对股票发行的披露不同,因此,这是一种量身定制的深思熟虑的方式”。[2022/7/15 2:14:30]
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
0000000000000000000000000000000000000000000000000000000000000001
对于小于32字节的定长数组会被自动填充到32字节:
>encode_abi("],).hex()
//自动填充0
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
欧易OKX将于明日上线合约冷静期功能:据官方消息,欧易OKX将于5月20日在web、app同步上线合约冷静期功能。合约冷静期功能开启后,用户将被暂停永续/交割合约交易,直至冷静期结束。
欧易OKX团队表示,希望合约冷静期功能可以帮助用户降低爆仓风险。该功能将在用户强制减仓、强制平仓后主动推送给用户,用户也可在交易页侧边栏主动开启。冷静期持续时长可灵活配置,但截止日到期前,用户将无法关闭冷静期。[2022/5/19 3:28:36]
动态类型
动态类型编码要稍微复杂一些,需要先计算偏移量进行占位处理,我们通过一个简单的例子来具体说明。
>encode_abi(","uint256","uint256"],
,,]
).hex()
//参数1的偏移量:32*3=96十六进制0x600000000000000000000000000000000000000000000000000000000000000060
//参数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将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。
标签:ATADATAPUTDATbigtourismdataStreamr DATAcoinBitconch Reputation HeatPDATA价格
在这篇文章中,来自UnstoppableFinance的特邀作者PatrickHansen讨论了欧盟在网络时代的斗争.
1900/1/1 0:00:00去中心化金融DeFi热度居高不下,作为资深的DeFi挖矿农民,除去我们平时常用的数据产品,今天分享5款高级的DeFi数据产品,帮助大家高效聚焦DeFi.
1900/1/1 0:00:00稳定币一直被加密货币交易者视为是买卖不稳定头寸非常热门的方法,如今,即使是传统的金融体係也开始将稳定币作为一种更有效的资金转移手段。市场由Tether发行的USDT主导,在市值方面仍遥遥领先.
1900/1/1 0:00:00“波卡知识图谱”是我们针对波卡从零到一的入门级文章,我们尝试从波卡最基础的部分讲起,为大家提供全方位了解波卡的内容,当然这是一项巨大的工程,也充满了挑战.
1900/1/1 0:00:00Nova基金团队十分荣幸地宣布其团队在项目过渡期间将由DFG提供资金支持。这将使得团队可以更加专注于为波卡生态和Kusama生态开发高质量的应用产品;同时得益于DFG的资金捐赠,团队也有了充足的.
1900/1/1 0:00:00前言:本文总结了一般大众可能好奇的关于NFT的具体概念、受认可程度、交易方式、手续费、制作方法等5个疑问.
1900/1/1 0:00:00