block解析
- difficulty,直接有返回
- extraData(额外数据),例如:0x476574682f76312e302e312f77696e646f77732f676f312e342e32,他的utf编码内容是:Geth/v1.0.1/windows/go1.4.2
- gasLimit gas最大限制,直接有返回 <这个块最大的gas数量限制,即所有交易的gas limit之和小于这个块的gas limit数量>
- gasUsed 块交易gas实际使用累加,直接有返回 <这个是所有这个块打包的所有的交易实际消耗的gas数量之和> 使用率的获得是(59.95% = gasUsed / gasLimit * 100%)
- block Hash块的hash,直接有返回
- 返回的logsBloom,日记块。日记块写下含有可索引的信息(写日记人地址和日记主题),这信息包含每个日记里交易列表中每个交易的接收人的登录信息
- 返回的miner,这个块的发现者,想把发现块的奖励发送到的地址。<这个块的奖励发送的地址>
- mixhash: 混合哈希值(“mixHash”):一个与随机数一起证明已经在这个区块中完成的充分的计算力总量的256位哈希值
- Nonce: 随机数(“nonce”):一个与混合哈希值一起证明已经在这个区块中完成的充分的计算力总量的256位哈希值
- 返回的number 也就是这个块当前位于整个链中的位置,例如可以说这个块在46953这个地方,也可以说是块的高度值
- parentHash字段,当前块指向之前的块的hash
- receiptsRoot: 接收人根(“receiptsRoot”):trie结构根节点的Keccak256位哈希值移植到这个区块交易列表中的每个交易的接收人
- sha3Uncles: 暂时不知道用处
- size: <这个块的实际大小>
- stateRoot: 状态根(“stateRoot”):trie状态根节点的Keccak256位哈希值,在所有交易被执行和定稿被应用
- timestamp: <这个块发现的时间戳>
- totalDifficulty字段,到这个块为止的难度之和
- 交易的数组字段transactions。这个字段需要分析出交易的类型,例如普通转账,合约的内部交易,合约代币转账。怎么区分是个问题,暂时没找到就是包括这些不同类型信息的交易信息。待信息数据模块完善后,可以具体分析下。
- 发现块的奖励。具体为当前发现一个块的奖励大小,打包在这个块中的交易use gas *gas price之和,相加即奖励。
详细计算:发现一个块默认奖励是5eth在 当块的高度 block height <= 4369999,当block height >= 4370000后区块奖励是3eth 所以如果M是奖励的eth数字 blockHeight <= 4369999时 M = 5,blockHeight >= 4370000 M = 3 1) 发现一个块的奖励 M eth 2) 每一笔交易自己的use gas * 每一笔交易自己的gas price = 真实消耗的cost ,然后块内所有交易的cost之和的值 3) 如果打包了叔块(一个块最多可以打包两个叔块),则会奖励一部分eth,计算方式如:如果打包了n个(n>=0 && n<= 2)n * M * (1/32) 4) 结果是M eth + total cost + M * 5 * (1/32) 就是这块最终的奖励
- 暂时不清楚uncles字段和Uncles Reward: 0 有什么特殊意义。 <如果你之前块是你的父块,那么叔块就是你父块的兄弟,你的父块得到了确认,叔块没有得到确认,如果没人理他,他就成了孤儿块,如果你把这个叔块包含进你的块中,那么就会成为你的叔块,每个块最多包含两个叔块,同时你会得到奖励>
详细计算:叔块的奖励(不是打包叔块的奖励) blockHeight <= 4369999时 M = 5,blockHeight >= 4370000 M = 3 当此叔块被打包的块的高度是blockHeight时, uncleHeight = blockHteigh - 1。 ( uncleHeight + 8 - blockHeigh ) * M / 8 = result value 就是最后的奖励,奖励给这个叔块的发现者,但是里面打包的交易,需要重新打包。
block中返回的交易信息解析如下:
- blockHash: 上面的块的hash
- blockNumber: Block Height:46953 (4852571 确认数字即在这个块所连接的链上,后续有继续连接了多少个块,叫对这个交易的确认数)
- from: 发起交易的账户
- gas: 不知道是哪个,感觉是gas limit ,也就是一笔交易的限制消耗的最大gas数量。就是Gas Limit: 21000 最大可被计算使用过的gas数量,当真正需要计算的所消耗的大于这个limit的时候,交易会失败
- gasPrice: 0.0000003 Ether (300 Gwei)这个是转化后的显示数字真实的是"300000000000",需要特殊处理下
- hash: 这交易的hash
- input: input字段,一般交易为空,如果是创建合约或者调用合约,则会附带一些数据
- nonce: 可以理解为当前这个发送交易账户,发送交易的记录 例如,第一次交易为0,第二次交易为1,第三次为2,一次类推。nonce 防止双花交易,这个值要和以太坊网络上的记录保持一致。高于这个值,则此交易无效
- to: 转到的账户地址
- transactionIndex: 这笔交易是块打包的第几笔交易
- value: 转账的金额,实际值为"50000000000000000" 转化为可以理解的就是0.05以太币
以下字段没有返回
- timeStamp时间戳就是所在块打包的时间
- Gas Used By Txn: 21000 计算真正使用的gas数量?
1. 如果交易发出之前计算的话使用: eth.estimateGas({from: fromAddress, to: toAddress, value:50000000000000}) 2. 如果是已经完成交易的可以根据tx hash 查询: eth.getTransactionReceipt(hash)
- Cumulative Gas Used: 21000 累计使用的gas数量,一笔笔交易的gas used相加得到的
每一笔交易真实消耗的gas之和 - Actual Tx Cost/Fee: 0.0063 Ether
<21000(Gas Used) * 0.0000003(Gas Price)>即真正使用的gas * 每个gas的价格,就是实际消耗的
补充信息
在block块中的信息,并不完全,如果要分析这笔交易的跟多信息,需要结合eth.getTransactionReceipt(hash)返回的结果值。
1. 可以得到当前交易的gasUsed,也就是真实用到的gas数量
2. 可以得到当前交易的状态字段status,0x0是失败,0x1是成功
3. logs字段,可以分析交易内部的一些事情,暂未搞明白
4. contractAddress字段,就是当你的toAddress字段是null,且input字段有内容时。查询交易状态时,contractAddress就是你的合约创建地址
5. cumulativeGasUsed也是展示在交易信息界面上的交易的第12个字段,可以不用自己加,这里直接有返回
最后遗留问题
怎么区分:普通转账,合约的内部交易,合约代币转账,怎么区分是个问题,暂时没找到就是包括这些不同类型信息的交易信息。待信息数据模块完善后,可以具体分析下。
-
补充
首先普通转账,很简单,交易信息中显示很详细 使用getBlock() 和 getTransactionReceipt() 基本很详细了。 其次是合约内部的交易,也就是转账到合约地址,然后被合约各种处理后,最后到了某个地址 这个主要通过debug_traceTransaction接口获取,分析返回的数据即可 最后是合约代币的流转 合约代币的流程一定会触发下面的事件 event Transfer(address indexed from, address indexed to, uint256 value); 分析getTransactionReceipt()数据中的logs字段,即可获得详细信息
-
转账流程分析如下
1. 普通的转账 fromAddress and toAddress 都是普通账户 描述:很简单就是两个账户余额的变化 2. 合约的创建 fromAddress 为普通账户, toAddress为nil,input字段有内容(就是要部署的合约的bytecode) 在交易getTransactionReceipt函数返回的结果中contractAddress字段有内容。这就是一个合约的创建交易。 例如:0x77350c5282d57507cb4b1d8298387878a52d1ecd1a40fa2d7985f0b3c822dc34 这笔就是创建合约的交易 https://etherscan.io/tx/0x77350c5282d57507cb4b1d8298387878a52d1ecd1a40fa2d7985f0b3c822dc34 3. 合约的调用 1) 普通地址转账到合约地址触发一些事件 - 购买某个合约的代币,转账到这个合约地址 合约执行某个事件为发送交易地址分配相应代币额度 合约会将 转账到合约地址的以太币 转到一个普通用户账户地址 - 如果不讲合约代币的合约。则如果转账到某个合约,则会根据合约代码的设计触发相对应的事件 2) 普通地址调用合约地址的方法触发代币转账 (最近经常用的) 3) 普通地址调用合约地址的公开方法做一些事情 <理论上2) 属于3)> - 最简单的就是调用合约公开方法改变内部存储的值,但是没有触发事件 https://etherscan.io/tx/0x43607252bf210c3d20fe9a659f45dddcd1725969d8471be7868e577f28a98e61 调用了函数,且传入了不同的值,但是没有触发事件 - 转账到合约地址,触发了事件,但是没有做转出,代币分发操作,此合约地址有余额 https://etherscan.io/tx/0x8d3e2be93030c39faf5642bd479055f8a0e99e5673142cdebc492004194376ae - 复杂的转账到合约地址,触发了事件,做了代币分发和合约转账到另一地址操作 https://etherscan.io/tx/0xd54e1fbc350dac428ca65a4abef6db4e343e1367e6cd9434bb14949a469cefc4
网友评论