教你用ETH进行聊天-ODAILY_DAT:GREATAPE

前言

前段时间,PolyNetwork被盗事件的一个小插曲,一地址向黑客地址转账在inputdata中告知其USDT已被冻结,不要使用USDT,黑客知晓后向该地址转账13.37ETH。

事后很多人便通过inputData在区块链上“聊天”向黑客“索要”虚拟货币,那么我们经常在区块链浏览器中看到的inputData到底是什么?知道创宇区块链安全实验室为您解答。

Inputdata

在以太坊协议中,当交易为合约创建时,inputdata是账户初始化程序的EVM代码;

而当交易为消息调用时,inputdata是合约函数调用数据。

正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址_to和你要转账的数量_amount,这些基本信息都包含在inputdata里面。

我们通过一个调用合约的转账交易具体分析,来理解消息调用时inputdata的结构。

解析形式:

原始形式:

币安发布暂停Multichain跨链桥代币充值、提现的更新:7月5日消息,据官方公告,币安将于7月7日08:00起暂停支持通过以下网络铸造的Multichain跨链桥代币的充值、提现业务,直至另行通知:通过BNB Smart Chain的Polkastarter(POLS)、通过BNB Smart Chain的Alchemy Pay(ACH) 、通过Fantom Network的Beefy.Finance(BIFI) 、通过BNB Smart Chain的SuperVerse(SUPER)、通过Ethereum Network的Travala(AVA) 、通过Avalanche C-Chain的Spell Token(SPELL)、通过Fantom Network的Alpaca Finance(ALPACA) 、通过BNB Smart Chain的Harvest Finance(FARM)。

币安提及,由于Multichain(MULTI)协议近期的情况,币安已于2023年05月24日暂停支持多个Multichain跨链桥代币的充值业务。[2023/7/5 22:18:59]

我们将原始的inputdata分为三个部分进行分析:

0xa9059cbb:函数标识符

000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一个参数为address即你要转账的地址,并补位到32字节即64个16进制字符

彭博社分析师:Grayscale在SEC诉讼中获胜的几率为70%:金色财经报道,彭博资讯高级法律分析师 Elliot Z. Stein 表示,Grayscale 70%的机会在一场重大加密行业诉讼中胜诉美国证券交易委员会 (SEC)。鉴于这种情况,该公司分析师认为比特币现货 ETF 今年在美国获得批准的可能性为 50%。美国证券交易委员会和主席Gary Gensler可能正在准备迎接损失,并希望通过在法院判决之前或大约同一时间批准现货比特币 ETF 申请来先发制人地软化损失或使其变得毫无意义。[2023/6/28 22:05:27]

0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二个参数为value即你要转账的数量,并补位到32字节即64个16进制字符

通过对比分析我们可以发现inputdata的基本结构为函数标识符+参数。

函数标识符

这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的Keccak哈希的前4字节。

我们可以通过代码bytess4(keccake256("transfer(adddress,uint256)"))或者在线工具获取这种函数签名。

下图可以看出加密结果的前四个字节(a9059cbb)跟inputdata中函数标识符一致。

Mercury Fund任命Samantha Lewis为合伙人负责Web3和金融科技基金:金色财经报道,Mercury Fund宣布任命Samantha Lewis为合伙人负责Web3和金融科技基金,SamanthaLewis 此前在 Mercury 旗下一些投资组合公司的董事会任职,其中包括区块链初创公司 Topl。Mercury Fund基金于2022年一月推出,其有限合伙人投资者包含多个知名加密机构,比如Galaxy Digital、Digital Currency Group、Accolade Partners、Evanston Capital、Isomer、Hutt Capital、Multiple Capital、Presight Partners和Rockaway,以及个人支持者a16z联合创始人Marc Andreessen和a16z合伙人Chris Dixon、科技投资者Bo Shao和Erik Voorhees等。(bizjournals)[2023/2/14 12:06:48]

这里之所以要将函数签名截断到四个字节是考虑到Gas成本问题。

在一笔交易中0字节需要支付4gas,而非0字节需要68gas也就是0字节的17倍。

在SHA-3加密中生成的32字节随机字符串更倾向于多的非0字节,所以大概成本是32x68=2176gas,而截断成本大概为4x68=272gas,可见截断到四个字节能够节省约8倍的gas费。

而函数标识符的作用是指定调用哪一个函数,在同一个合约中两个不同函数的SHA-3签名的前4字节相同的概率是十分小的,所以截断到四个字节实际不会影响函数调用。

DeFi结构化产品GammaSwap完成170万美元融资:2月6日消息,DeFi结构化产品GammaSwap完成170万美元种子轮融资,参投方包括Skycatcher Crypto、Dialectic、Space Whale Capital、Modular Capital、Portico Ventures、Ouroboros Capital、Owl Ventures、RenGen、Manifold Trading,个人投资者包括GMX核心成员以及DeBank上持仓金额第二大钱包所有者等。GammaSwap旨在通过与DEX集成来使用户获得代币的杠杆敞口。[2023/2/7 11:50:47]

参数

在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

福布斯:SBF对Alameda情况并非一无所知:12月4日消息,《福布斯》杂志近日发文披露2021年1月采访SBF的信息,彼时SBF向《福布斯》展示其个人资产的记录表格,并数次更新和解释,包括Alameda交易一部分SOL、从币安处回购部分FTX股份等。

《福布斯》杂志表示,虽然该表格并不能表示SBF对Alameda的所有活动均有了解,但也并非如其所说的那样一无所知。原三箭资本创始人Su Zhu对此发推补充,SBF在今年7月也知道自己必须设计对BlockFi和Voyager的虚假救助,还密切参与了Voyager拍卖,甚至知道Alameda无法将自己的5亿美元贷款归还给Voyager,“他在那个月的行为非常离奇”。[2022/12/4 21:20:54]

0000000000000000000000000000000000000000000000000000000000000001

对于小于32字节的定长数组会被自动填充到32字节:

>encode_abi("],).hex()

//自动填充0

0000000000000000000000000000000000000000000000000000000000000001

0000000000000000000000000000000000000000000000000000000000000002

0000000000000000000000000000000000000000000000000000000000000003

动态类型

动态类型编码要稍微复杂一些,需要先计算偏移量进行占位处理,我们通过一个简单的例子来具体说明。

>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将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:46ms0-1:462ms