深入Ethereum Raw Transaction

admin7个月前科学家270

每次看完raw transaction的組法,都會忘記,所以紀錄一下

使用Web3元件呼叫smart contract的function,就我所知有兩個方法 ,一個是自己組成raw transaction,另一個是用web3j產生的 java wrapper呼叫(不過最終還是組成raw transaction)。在這邊就是要介紹raw transaction到底是怎麼組成的 首先,會先對function做encoding的動作,encoding完會長得下面這樣,一堆hex字串

以上圖來說,我對addMember(address, bytes, bytes…)(參數太多,所以做省略)這個function做encoding,最前面是function的symbol,作sha3然後取前四個bytes

keccak256("addMember(address,bytes,bytes,...)") //0x9400062b56b462ed4e31c3f26b13ce3523a3881b5c19480da8856142e9b687d0

後面緊接著的就是參數了,這個很容易理解。更詳細的解釋可以參考Inside an Ethereum transaction,解釋得很清楚

接下來,就是把encoded function組成raw transaction了,組完的結果會像這樣

在原本的hex字串,頭尾加上一堆不知道幹嘛的字串,本篇的重點就是在解釋這個字串。

如果,讀者有看完上面那篇Inside an Ethereum transaction,就可以知道,其實transaction的組成是由

var rawTx = { 
   nonce,
   gasPrice,
   gasLimit,
   to,
   value,
   data,
   signature
};

這裡的data就是encoded function,所以前面還有nonce, gas price, gas limit跟送給誰的地址,最後是加上signature。不過,如果你直接看,一定會納悶,感覺對但好像又不對,中間似乎穿插了莫名的值,這是因為Ethereum在做serialize的時候,選用RLP做encoding,這裡不對RLP做解釋,有興趣的可以參考這裡,還滿好懂的。

所以把上面那串raw transaction做分解,可以得到下面的圖

藍色的部分,就是剛剛提的那些東西,而黑色字體的,就是RLP encoding的prefix,簡單來說,這些prefix就是告訴解析者資料有多長。

舉例來說,”85 04a817c800",85就是0x80加5,以RLP的規格,資料是0–55 bytes的是以0x80開頭,然後再加上資料長度,也就是5個bytes ( len(“04a817c800”)/2,兩個hex字是一個byte ),所以開頭就是85。”f9 03ab” 這個就複雜一點,以0x80開頭,如果資料長度過長勒?! 所以在RLP定義裡,超過55 bytes長度的就以0xf7做base,後面接著是資料長度的數字,有點難解釋,直接用例子。
開頭”f9 03ab”,”03ab”代表資料長度-939 bytes,而“f9”就是0xf7 + 0x02,而0x02就是”03ab”的長度。RLP的encoding大概就是這樣。

最後的signature就是直接放rsv(把rawTx作RLP encoding然後hash再sign,然後取rsv值)

今天廢話比較少,如果有跳太快不懂的地方,請歡迎指教喔!


相关文章

实现 pancakeswap 自动交易

https://pancakeswap.finance 是币安智能链上的一个主要的去中心化交易平台,类似于(抄) 以太网上的 uniswap。因为我的资金主要在币安智能链上,所以一直想要写一个...

python使用requests发送text/plain报文数据

import requests import os os.environ['http_proxy'] = 'http://127...

如何实现简单的ETH 链上程序监控

准备你最好会一点python ,如果一点程序也不懂,可以试着学习一些简单的python你需要有一台 mac 或linux 电脑,会打开终端(Terminal)注册一个infura.io 的账号,拿到a...

What is the bitcoin network fee?

Transaction fees are included with your bitcoin transaction in order to have your transaction proces...

离线签名

离线签名是指在没有连接互联网的情况下对交易进行数字签名的过程。这种做法通常用于提高加密货币交易的安全性,尤其是在涉及大量资金时。离线签名防止了私钥在联网设备上泄露的风险,从而减少了被黑客攻击和盗窃的可...

如何在离线电脑上WIN 7系统上安装扫描二维码

如何在离线电脑上WIN 7系统上安装扫描二维码

首先是开源工具https://github.com/1357310795/QrCodeScanner/releaseswin 7 使用V1.4.1版本 QRCODE 扫描器MyQrCodeScanne...