Transactions

如何編碼空交易欄位?

  • December 27, 2021

我想對一個(n 無符號)交易進行 RLP 編碼。交易的某些欄位可以為空/空/零。不過,我想知道它們是如何編碼的。

讓我們假設以下交易欄位:

signer_nonce = 0
gas_price = 0
gas_limit = 21000
destination = nil
amount = 0
payload = nil

Nonce、gas 價格、限制和數量可以使用任何 RLP 編碼器輕鬆編碼,並且 的值0x00非常好。

但是,如果我沒有任何數據或任何收件人地址,如何對空欄位進行編碼?

Eth::Util.bin_to_hex(RLP.encode(nil))
/home/user/.gem/ruby/3.0.0/gems/rlp-0.7.3/lib/rlp/sedes.rb:31:in `infer': Did not find sedes handling type NilClass (TypeError)
   from /home/user/.gem/ruby/3.0.0/gems/rlp-0.7.3/lib/rlp/encode.rb:51:in `encode'
   from (irb):14:in `<main>'
   from /usr/lib/ruby/gems/3.0.0/gems/irb-1.3.6/exe/irb:11:in `<top (required)>'
   from /bin/irb:23:in `load'
   from /bin/irb:23:in `<main>'

我無法將地址設置為,0x00因為這將是一個有效的地址 afaik。我應該使用空字元串字節0x80嗎?我如何區分零字節和空字元串0x80

Eth::Util.bin_to_hex(RLP.encode(""))
=> "80"
Eth::Util.bin_to_hex(RLP.encode(0))
=> "80"

如何編碼空交易欄位,例如空數據或無收件人地址?

所有這些欄位都必須提供且不應提供nil。使用 RLP 對交易進行編碼時,通常有 2 種不同的類型:256 位數字和字節。

因此,如果我們有一個data空字節,我們會將其編碼為一個空字節(例如0x)。在這種情況下,空字元串和空字節是相同的,因為字元串會在 RLP 編碼之前轉換為字節。

對於地址,它有點棘手。它被定義為長度為 20 的字節。除非您有創建事務,否則它是一個空字節。

您可以在 Kethereum 儲存庫中找到一個範例:

您可以在第 5 頁開頭的乙太坊黃皮書中找到更正式的定義。

例如,可以在EIP-1559中找到最新格式的應在事務中編碼的所有欄位的列表。

引用自:https://ethereum.stackexchange.com/questions/117384