可能你也注意到了,在跟智能合约交互时,你的事务会自动包含inputdata。在MyCrypto钱包界面,这些数据有个简单的标签:“Data”——它是做什么的呢?
这篇文章就是从技术上解释事务输入数据是怎么一回事,它实质是什么,又是怎么工作的。
-MyCrypto钱包的高级事务设定-
什么是InputData?
我们先来看看这笔token转账交易。某个人发送了0ETH到?0xd26114cd6ee289accf82350c8d8487fedb8a0c07,而且Etherscan网站呈现了这是一笔意图发送0.19OMGtoken到这个地址的事务。那么,EVM究竟是怎么知道,这个人想要转账某个数额的token到另一地址的呢?
你再仔细看Etherscan,就能看到这笔事务带着inputdata。inputdata是发送者为这笔事务附加的额外数据,既可以是普通的文本,也可以是数字。但在这笔交易中,发送者使用这部分数据来“告诉”合约,让合约运行特定的函数。智能合约本身是由一系列函数组成的。举例而言,一个ERC-20token合约使用比如“transfer”来把token从A账户转移到B账户,使用“balancerOf”函数来获得某个地址的余额,等等。在我们研究的这笔交易中,你可以看到它调用了?transfer(address_to,uint256_value)?函数。
徐明星新书《趣说金融史》正式发布 科普金融发展之道:金色财经现场报道,9月23日,欧科云链创始人徐明星携手著名财经作家李霁月、行业观察者顾泽辉力作《趣说金融史》一书,跨越5000年金融历史,重读金钱故事,并预测新的金融时代。该书由中信出版社出版,将于近期正式发售。据了解,本书可以更好地呈现金融的起源与发展,帮助人们理解货币、金融与未来经济。作为区块链行业领军企业——欧科云链的创始人,徐明星深知技术探索对经济社会的重要推动作用,他曾先后出版过《图说区块链》、《区块链:重塑经济与世界》、《通证经济》、《链与未来》等行业权威著作,解读区块链等新型技术的推动下,金融与社会的升级之道,对经济社会发展做出了重大贡献。其中,《区块链:重塑经济与世界》曾作为新中国70周年重点推荐图书之一被相关书店推荐。[2021/9/23 17:00:57]
这笔事务的输入数据为0xa9059cbb0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa26152000000000000000000000000000000000000000000000000002a34892d36d6c74。你可以把这一长串的?十六进制?数据分解一下。开头的0x表示这是一个十六进制数值,紧接着的8个字节是函数标识符,再然后就全部是以32字节为一组的函数参数。所以第一组是?0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa261520?而第二组是?000000000000000000000000000000000000000000000000002a34892d36d6c74。
火币推出《一分钟读懂DeFi》系列科普视频:据官方消息,8月24日,火币推出《一分钟读懂DeFi》系列科普视频,并与微博财经合作冠名播出,布道DeFi认知,助力行业发展《一分钟读懂DeFi》是由火币成长学院打造的业内首个系统全面讲解DeFi的系列科普动画,继推出《区块链100问》后的再续佳作。《一分钟读懂DeFi》系列动画对DeFi的发展进行系统梳理,适合想要由浅入深、全面系统了解区块链DeFi的人们轻松了解DeFi。目前视频已由火币网官方微博发布。[2020/8/24]
-InputData分解-
如果你在Etherscan上查看这些数据,你会看到它以下文这个形式呈现:
Function:transfer(address_to,uint256_value)
MethodID:0xa9059cbb
:0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa261520
:00000000000000000000000000000000000000000000000002a34892d36d6c74
十六进制是啥?
十六进制是一种计数系统,就像十进制和二进制一样;十六进制使用数字0到9和字母A到F,来对应表示十进制的0到15。下面这种图展现的就是这样的对应关系。十六进制常常用来更直观地表示大数字。
人大附中物理老师李永乐科普拜占庭将军问题和区块链:5月14日,人大附中物理老师、科普视频网红李永乐在其公众号发布视频《拜占庭将军问题是什么?区块链如何防范恶意节点?》。李永乐老师在视频中对拜占庭将军问题和区块链进行了讲解,他表示,拜占庭将军问题本质上指的是,在分布式计算机网络中,如果存在故障和恶意节点,是否能够保持正常节点的网络一致性问题。在近40年的时间里,人们提出了许多方案解决这一问题,称为拜占庭容错法。例如兰波特自己提出了口头协议、书面协议法,后来有人提出了实用拜占庭容错PBFT算法,在2008年,中本聪发明比特币后,人们又设想了通过区块链的方法解决这一问题。区块链通过算力证明来保持账本的一致性,也就是必须计算数学题,才能得到记账的权力,其他人对这个记账结果进行验证,如果是对的,就认可你的结果。与拜占庭问题比起来,就增加了叛徒的成本。[2020/5/14]
-十进制数字与对应的十六进制字符-
单个十六进制字符所能表示的最大数值是15,长度是4个比特。多个十六进制字符相连时,你要把每个字符的二进制表示前后拼接在一起,才能得到其十进制数值。举个例子,0x5C,可以写成0101(=5)和1100(=C),前后拼接就是01011100,这就是二进制形式的92,所以十六进制数0x5C的数值就是92。
大多数编程语言都使用前缀0x作为绝对标识符,将十六进制数与其他的计数类型区别开来。这个前缀本身没有任何意义,只是为了清晰。我们这篇文章也会采取一样的做法,十六进制数都用0x开头。
动态 | 币安科普MimbleWimble算法:币安官方推特今日发布隐私算法Mimblewimble的科普贴,在下方留言区大量网友留言猜测是否是基于 Mimblewimble算法的隐私币Grin或者Beam即将登陆币安交易所,其中猜测Grin的呼声更高。[2019/9/2]
讲完这些,我们继续。如果你还是没能理解十六进制,也不用担心——对于理解inputdata来说不是必需的。
InputData与智能合约
InputData的首要用途就是与智能合约交互。大部分智能合约都使用?合约ABI规范,使得Etherscan这样的网站能自动解码inputdata并显示事务所调用的具体操作。在我们上面那个例子中,这是一笔有关代币合约的事务,而且代币合约遵循ERC-20标准。这也就意味着,我们都知晓所有可能调用的函数,以及它们的?签名。举例,用于ERC-20合约的transfer函数的完整签名总是?transfer(address,uint256),意味着这个函数需要两个参数,所传入的第一个参数会被解读为一个地址,第二个参数会被解读为一个未签名的256位的数字。
Solidity语言有多种参数类型。如果你有兴趣学习Solidity语言和智能合约,你可以在Solidity文档页面了解更多。
函数签名
如你所见,transfer函数的签名是?transfer(address,uint256),这个对所有ERC-20合约都是一样的。如果某个合约给转账函数安排不一样的参数类型,比如一个地址和一个uint128,这个合约就不是“ERC-20兼容”的。
要获得一个函数的签名的十六进制形式,我们先要获得这个函数的SHA-3哈希值的前面4个字节。而要想知道一个数据的Keccak-256哈希值,你可以使用JavaSceript语言的web3库,或者求助于这样的在线工具。在这个工具页面填入?transfer(address,uint256),它会显示?0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b?作为结果。取前8个字符,就是?a9059cbb,恰好跟上述事务的MethodID一致。
声音 | ETC Labs主管:科普教育是未来几年公链面临的巨大挑战:ETCLabs主管Darin Kotalik认为,科普教育是未来几年公链面临的巨大挑战,人们必须要对区块链有基本的认识,分清楚公链和私链的区别。[2019/8/25]
另一个例子:ERC-20标准合约的approve函数的函数签名是?approve(address,uint256),其SHA-3哈希值是?0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba,首8个字符是?095ea7b3,因此,调用许可函数的inputdata开头就会是0x095ea7b3。这笔发往DAItoken合约的事务就是如此。
地址和数量
每一个参数的长度都是32字节,或者说64个十六进制字符。但以太坊地址只有40个字节长。为了解决这个问题,地址参数要用0来填充。在十六进制里面,0x0000123和0x123是一样的,因此?0x0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa261520等同于?0x4bbeeb066ed09b7aed07bf39eee0460dfa261520,而且?0x00000000000000000000000000000000000000000000000002a34892d36d6c74?也就等于?0x2a34892d36d6c74。那为什么我们要填充这些0呢?
就像我们上面说到的,Solidity合约可以接受的最大数值是2256?-1,刚好是32字节。使用固定的长度可以让EVM和其他应用在解码数据时候更轻松,因为你可以假设每一个参数的长度都是一样的。
那数组和字符串呢?
如上所述,在inputdata中使用数组和字符串,情形会有些许不同。因为数组本质是多个东西组成的一个列表。举个例子,1、2、3三个数所组成的列表在大多数编程语言中都可以写为。要在事务中发送这种数据,列表中的每一个对象都要作为32字节一组的数据发送,列在inputdata的结尾。指明数组长度的指针就作为参数。
假定我们有一个叫做?calledmyFunction?的函数,接收一个地址和数字的数组作为参数,即?myFunction(address,uint256)。该函数的函数签名是0x4b294170。地址这一项,我们照上面所说的操作。因为我们的数组包含3个对象,数组的长度用十六进制表示为0x3。然后每个对象都要占据恰好32自己的空间,且数组要放在所有其它参数之后,所以数组会从32+32=64字节之后开始。
000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
-例子:input数据要按照32字节一组来切分-
因为字符串的长度是任意的,它们要按32字节一组来切分,处理方式跟数组相同。
像Etherscan这样的网站是如何解码inputdata的?
哈希函数是单向函数,所以如果你只有函数签名的哈希值,是不可能会恢复出函数签名的。合约的所有者可以将合约的ABI作为JSON文件上传,就像这个例子,这可以用来拿到函数签名的哈希值。
即使合约的所有者不上传合约的ABI,也能够解码input数据。因为,ERC-20合约函数的签名都是一样的,因此Etherscan只需使用一个预定义的合约ABI即可服务大部分合约。举个例子,ERC20合约的转账函数的合约ABI如下文所示
如果输入数据里的签名与任意一个预定义的函数相匹配,Etherscan都能解码inputdata。
inputdata的大小有没有什么限制?
既有,也没有。以太坊协议没有为inputdata的长度设固定的上限,但inputdata也消耗gas。单个区块可用的Gas数量是有上限的,在本文撰写时是800万。每一个0字节都要消耗4gas,而非零的字节要消耗68gas。一笔标准的ETH转账事务要消耗21000单位gas,所以,如果不考虑调用合约的交易,当前inputdata的最大长度是2MB,或者全部用非零字节的话,就是0.12MB。因为inputdata不会只有零,也不会一个0也没有,所以实际的大小会在两者之间。
如果你想看实时的区块Gas上限,可以看ETHStats.net。
-特定区块的Gas上限-
只需将鼠标停留在“GasLimit”部分的某个区块上,就可以看到其Gas上限。
更多信息
合约ABI规范ERC-20Token标准以太坊虚拟机
参考
以太坊黄皮书Solidity文档
原文链接:
https://blog.mycrypto.com/why-do-we-need-transaction-data-/
作者:?MaartenZuidhoorn
翻译:?阿剑
标签:PUTDATAATADATInternet Computer(Dfinity)PDATA币ZATATZUDATADOGE
撰文:DonnagerUniswap经过投票计划将V3上线二层扩容网络Arbitrum在引发了社区热议的同时,也让市场感受到了二层网络势不可挡的浪潮已经形成.
1900/1/1 0:00:00币圈新鲜事5月31日热点提要:1.?鲁比尼:虚拟货币不算新形式的货币。2.马斯克将成为加密未来不可或缺的一部分。?3.嘉盛集团:比特币上涨空间有限“币圈”预计将会面临收缩.
1900/1/1 0:00:00中国证监会科技监管局局长姚前在近日的国际金融论坛2021春季会议上表示,数字人民币的诞生,是在数字化浪潮的背景下,中央银行有必要主动创新法定货币发行和流通方式,探索央行数字货币.
1900/1/1 0:00:00最大的ETH2.0和Terra质押服务之一,现在正寻求扩展到其它权益证明链,从新起的第1层Solana开始.
1900/1/1 0:00:006月5日,“2021加密艺术之舞:趋势、未来与投资机遇”加密艺术论坛在中国未来区块链创新中心正式开幕。本届论坛由巴比特、CryptoC联合联合主办.
1900/1/1 0:00:00CME比特币期货5月29日,CFTC公布了最新一期CME比特币期货周报,最新统计周期以「5·19」大跌开篇,即使是在统计周期中后段行情已经出现了近10000美元的大幅反弹的情况下.
1900/1/1 0:00:00