链资讯 链资讯
Ctrl+D收藏链资讯

以太坊 Input Data 解析

作者:

时间:

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

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

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

而当交易(transaction)为消息调用时,input data 是合约函数调用数据。正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址 _to 和你要转账的数量 _amount,这些基本信息都包含在 input data 里面。我们通过一个调用合约的转账交易具体分析,来理解消息调用时 input data 的结构。

解析形式:

原始形式:

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

0xa9059cbb:函数标识符

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

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

Ledger CEO:投资者不应该依赖中心化平台管理资产,不要把代币和私钥交给任何人:8月26日消息,硬件钱包Ledger首席执行官Pascal Gauthier表示,去中心化服务和硬件安全钱包的兴起意味着人们不再需要依赖中介来管理金融资产和数据,他敦促人们承担更多责任。

Gauthier在Surfin’ Bitcoin 2022大会上表示,最近中心化交易所相关事件表明为什么投资者不应该依赖中介来管理自己的数字资产。

虽然大多数行业参与者的意图都是好的,但Gauthier表示“加密行业还太年轻”,目前的经济状况“处于压力之下”,如有必要,中介机构将继续阻止投资者在需要时访问资产,并引用Celsius作为例子,“不要把你的代币和私钥交给任何人,因为你不知道他们会用它做什么。”

Gauthier认为,从Web2到Web3的过渡需要时间,因为如今的互联网用户对Web2服务的速度和效率感到满意。(Cointelegraph)[2022/8/26 12:50:13]

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

函数标识符

这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的 Keccak(SHA-3)哈希的前 4 字节(高位在左的大端序)。

我们可以通过代码

bytess4(keccake256("transfer(adddress,uint256)"))或者在线工具获取这种函数签名。下图可以看出加密结果的前四个字节 (a9059cbb) 跟 input data 中函数标识符一致。

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

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

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

欧洲议会推迟对加密资产法案拟议法规中有关PoW辩论的投票:2月25日消息,为了回应来自加密世界的愤怒,欧盟议会推迟了一项针对其加密货币市场监管的关键投票。被称为MiCA的“加密资产市场指令”本已列入2月28日的投票名单,将由欧洲议会与欧盟理事会和欧盟委员会进行辩论。然而,欧盟议员、负责投票的报告员Stefan Berger今天表示,此次投票已被推迟。

一名接近该指令谈判的消息人士称,争论的要点是后期的变化,一些人将其解读为针对PoW网络的禁令。在信息泄露后引发了负面报道和Twitter上铺天盖地的回应后,右翼和中右翼成员撤回了对最新修正案的支持。

Berger在Twitter上解释说:“作为报告员,对我来说最重要的是,MiCA指令没有被误解为事实上的比特币禁令。”(The Block)[2022/2/25 10:16:20]

参 数

在 evm 执行字节码的约定中,静态类型左补齐零至 64 长度,而动态类型则是右补齐零至 64 长度。归纳下常见的静态类型:uint,bool,Address,bytes[0-32], 动态数组类型:bytes,string,address[],bytes32[].....我们通过 pyethereum的ABI编码函数 来研究不同数据类型的编码方式。静态类型先导入 encode_abi 函数

import rlp ?from ethereum.abi import encode_abi

我们以函数 transfer(address,uint 256) 为例

> encode_abi(["address", "uint256"],[345d8e3a1f62ee6b1d483890976fd66168e390f2,1]).hex()000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f20000000000000000000000000000000000000000000000000000000000000001

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

> encode_abi(["int8"],[[1, 2, 3]).hex()// 自动填充 0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003

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

> encode_abi( ?["uint256[]", "uint256[]", "uint256[]"], ?[[0xa1, 0xa2, 0xa3], [0xb1, 0xb2, 0xb3], [0xc1, 0xc2, 0xc3]]).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 的数据000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b3//0x160 位置。参数 3 的数据000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c3

短地址攻击经过前面的分析当静态类型如 address 长度不足 32 字节时 EVM 会根据规则将长度补齐到 32 字节,如果当转账的地址以00结尾,如0x641988625108585185752230bde001b3ebd0fc00,转账时将地址后面的两个零去掉,EVM 依然会认为 address_to是 32 位的,所以它会从_value的高位取 0 来补充,amount的位数会多两位也就是会乘以256。攻击过程如下:

将恶意转账地址最后一个字节的 0 去掉函数标识符:a9059cbb转账地址:000000000000000000000000641988625108585185752230bde001b3ebd0fc转账金额:00000000000000000000000000000000000000000000000000000000000000001由于 EVM 的补位规则,解析结果为:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100我们分解后发现,转账金额已经多了两位也就是多了一个字节,即为原来转账的 256倍函数标识符:a9059cbb转账地址:000000000000000000000000641988625108585185752230bde001b3ebd0fc00转账金额:00000000000000000000000000000000000000000000000000000000000000100

如何在 input data 附着信息

在以太坊中直接进行转账交易的 input data 字段默认是没有内容的,但是我们可以通过设置钱包实现文章开头的“聊天功能”。我们以 MetaMask 钱包为例展示如何通过转账在 input data 字段附着一些额外的信息。

1、首先我们需要打开钱包高级选项的显示十六进制数据开关

2、在转账时将你要附着的信息通过十六进制编码后填入下方十六进制数据中,记得在开头加上 0x 然后进行转账

3、转账成功后在 etherscan 中就能够看到附着信息

总结

我们能够通过交易中的 input data 将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。

标签:DATATADATAPUTSmpl foundationKATANA价格Medical data linkBitconch Reputation Heat

欧易okex官网热门资讯
金色百科 | DeFi中大火的AMPL是什么币?

AMPL是基于以太坊的 DeFi 项目——Ampleforth (原名为 Fragments) 的代币。正如白皮书的标题《Ampleforth:一种新的合成的商品货币》所言,Ampleforth想打造成一种全新的加密货币AMPL,价格和美元锚定。

电子现金很方便?或许你还不了解法定数字货币

大部分人在日常出行和购物消费时,都会倾向于选择支付宝、微信来支付。仅仅几年时间,电子现金的出现已经改变了人们的生活方式,也提高了支付效率。 从实物、贵金属等自然货币发展到铸币、纸币等人工货币,再到今天的电子支付方式,货币一直在不断地发展和进步。

频频出现的Libra和DECP究竟是什么?两者有何关系?

自2019年6月18日起,Facebook Libra就成了区块链媒体文章中的常见词汇。而在2019年10月24日刮起了学习区块链的一场大风之后,各种新闻报道和普及文章纷纷来袭。

Filecoin为什么需要复制证明和时空证明?

在关于Filecoin的各种介绍中,我们经常听到这样两个技术术语:复制证明和时空证明,这两个术语是Filecoin系统的核心,也是Filecoin系统中挖矿的关键点。 那么这两个术语到底是什么意思呢?这就要从整个Filecoin的工作流程说起。

升级在即:12月6日以太坊伊斯坦布尔硬分叉

以太坊的第八次网络升级迫在眉睫。 第8次以太坊硬分叉将于2019年12月6日进行。若不懂硬分叉是什么,也可以将其视为“网络升级”。硬分叉的确切日期可能会因网络的出块时间和各地时区而有所差异。前往Etherscan可查看伊斯坦布尔硬分叉倒计时。 伊斯坦布尔是以太坊1.x的众多硬分叉之一,将于Serenity(以太坊2.0)之前执行。

区块链和“大饼”的前世今生 | 白话区块链入门205

向父母介绍完区块链之后,他们就会放过你了吗?反正我父母没有,接着开始追问:那区块链和炒 Token 有什么关系?尤其是那个比特币,究竟是个什么东西? 这让我想起来在刚刚入门区块链行业的时候,最令人印象深刻的一种介绍方式:要想了解区块链,必须先从大饼开始。