前段时间,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 的结构。
解析形式:
以太坊链上单小时转账量达月内新低:据Glassnode数据显示,以太坊链上单小时转账量自5月19日单小时3.6万次后持续下跌,目前单小时转账2.5万次,达到了近一个月以来低点。[2021/5/27 22:49:16]
原始形式:
我们将原始的 input data 分为三个部分进行分析:
0xa9059cbb:函数标识符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2: 第一个参数为 address 即你要转账的地址,并补位到 32 字节即 64 个 16 进制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000: 第二个参数为 value 即你要转账的数量,并补位到 32 字节即 64 个 16 进制字符
?通过对比分析我们可以发现 input data 的基本结构为函数标识符+参数
函数标识符
这里的函数标识符即为函数选择器,根据官方文档可知函数选择器是某个函数签名的 Keccak(SHA-3)哈希的前 4 字节(高位在左的大端序)。
我们可以通过代码
声音 | Multicoin Capital执行合伙人:以太坊2.0有结构性和根本性的开放性问题:Multicoin Capital执行合伙人Kyle Samani表示,项目是否留在以太坊完全取决于开发人员想要构建的应用程序类型。对于开放金融应用程序,以太坊是最佳构建场所。他指出,有几个项目正在构建不是以开源金融为中心的应用程序,这些项目寻求的最重要因素是可拓展性。当被问到以太坊向以太坊2.0的过渡,以及开发者在此场景中选择其项目所基于的平台时需要考虑的因素,他表示,“我可以非常肯定地说,我们真的不知道以太坊2.0将如何工作。关于它实际上是如何工作的,有一些高层次的想法,但也有相当多的结构性和根本性的开放性问题。”他表示,在2019年10月份的Devcon上,该系统的结构发生重大变化,“他们改变了分片数量,以及分片将如何交联。”他表示,“我们还可以看到,以太坊团队在研究其他团队正在做的事情,并调整他们的一些想法。可以肯定地说,我们只是不知道Eth 2.0会是什么样子,很有可能最终产品甚至不是目前计划中的产品。”他最后表示,开发者必须选择是否将所有鸡蛋都放在以太坊的篮子里,因为他们不知道“这艘船要去哪里”,在中长期内选择更具确定性的其他区块链。(AMBCrypto)[2020/1/4]
bytess4(keccake256("transfer(adddress,uint256)"))或者在线工具获取这种函数签名。下图可以看出加密结果的前四个字节 (a9059cbb) 跟 input data 中函数标识符一致。
动态 | 以太坊已达到原定伊斯坦布尔升级高度:ethernodes.org数据显示,目前以太坊区块高度已达到9069000,伊斯坦布尔升级完成。
据悉,本次伊斯坦布尔升级包含6个改进提案:
1)EIP-152:添加Blake2预编函数;
2)EIP-1108:降低alt_bn128预编译Gas成本;
3)EIP-1344:添加ChainID操作码;
4)EIP-1884:重新定义基于trie-size的操作码;
5)EIP-2028:降低Calldata Gas费用;
6)EIP-2200:考虑SLOAD Gas费用的变化下重定义SSTORE Gas费用的净值。
在以太坊 1.X 的路线图中,下一次升级代号为「柏林」,计划于 2020 年 6 月进行。在此之后,以太坊还会进行两次升级,代号分别为「伦敦」和「上海」。另外,以太坊开发者还提议在区块高度 9,200,000 进行硬分叉以移除逐渐显现的「难度炸弹」,预计发生在 1 月 6 日前后。在移除难度炸弹之前,区块生成时间将一直保持增长,到 1 月 6 日左右可能会达到 25 至 30 秒时间。[2019/12/8]
这里之所以要将函数签名截断到四个字节是考虑到 Gas 成本问题。
在一笔交易中0字节需要支付 4 gas,而非0字节需要 68 gas 也就是 0 字节的 17 倍。在 SHA-3 加密中生成的 32 字节随机字符串更倾向于多的非 0 字节,所以大概成本是32x68=2176 gas,而截断成本大概为 4x68=272 gas,可见截断到四个字节能够节省约 8 倍的 gas 费。
动态 | 企业以太坊联盟在首尔开设区域办事处:据ethnews报道,11月19日,企业以太坊联盟(EEA)宣布在韩国首尔开设新的区域办事处。EEA于去年2月在纽约成立,由数百家公司组成,致力于开发基于以太坊的企业区块链解决方案的全面标准。EEA希望新的区域办事处能够帮助加速大规模采用EEA标准。[2018/11/22]
而函数标识符的作用是指定调用哪一个函数,在同一个合约中两个不同函数的 SHA-3 签名的前 4 字节相同的概率是十分小的,所以截断到四个字节实际不会影响函数调用。
参 数
在 evm 执行字节码的约定中,静态类型左补齐零至 64 长度,而动态类型则是右补齐零至 64 长度。归纳下常见的静态类型:uint,bool,Address,bytes, 动态数组类型: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
动态 | 苏黎世联邦理工学院创建以太坊智能合约扫描器:据techcrunch.com消息,苏黎世联邦理工学院研究人员创建了一个以太坊智能合约扫描器,可以检查智能合约是否存在漏洞或潜在的问题。据悉,一项关于开源以太坊合约的研究表明,由于覆盖范围不足,现有的解决方案可能会漏掉多达三分之二的漏洞。该团队表示将于本周正式推出这款产品。该项目是自筹资金的,团队明确表示他们永远不会启动ICO。[2018/7/3]
对于小于 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 将一些信息永久存储在区块链中,可以通过此项技术在食品药品监管部门的产品防伪溯源、财税部门的电子票据打假验真、学术成果存证等方面实现应用落地。
只要是进入币圈一段时间的同学们,应该都听过EOS(佳能相机发币了?)的大名。那么EOS到底是什么呢?今天驼哥带你了解一下? EOS是个底层公链项目,全称是“Enterprise Operatin.
1900/1/1 0:00:00Ethereum Name Service(ENS) 于 2017 年 5 月 上线以太坊,ENS 提供的服务是将用户自定义的后缀为 .eth 域名映射到用户地址上.
1900/1/1 0:00:00在白话区块链之前的推文《被称为区块链 3.0 的 EOS 是什么》中提到:比特币就像大哥大,只有打电话功能;以太坊像小灵通,除了打电话,还可以有一些小游戏;EOS 就像第一代的 iPhone.
1900/1/1 0:00:00六月下旬,区块链项目 Algorand 主网正式上线,主网中流通的 Token 也开启了荷兰式拍卖.
1900/1/1 0:00:00作者 | WJ出品|白话区块链上一回 | 第3回:比特币国度里的国王很短命上回,我们讲到比特币王国里的国王有区块1世、区块2世......一直到了现在的第几十万世.
1900/1/1 0:00:00莱特币减半,完整的说是莱特币挖矿区块奖励减半。以2019年8月5日减半为例,在此之前矿工挖到一个区块可获得25个LTC奖励,但减产之后,挖到一个区块的奖励只有12.5个LTC.
1900/1/1 0:00:00