Web3js

keccak256 輸出在 ruby 和 javascript 上是不同的…?

  • February 10, 2022

Ruby 乙太坊庫使用: https ://github.com/phusion/digest-sha3-ruby

require 'digest/sha3'
'0x' + Digest::SHA3.new(256).hexdigest('0x0')
=> "0x77b7d82d931e1a403db0240b08c0716665eec4664af617c457918e4a67bc1810"

…然而在 javascript 領域(使用 web3 或 ethers):

web3.utils.keccak256('0x0')
=> '0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a'

ethers.utils.keccak256('0x0')
=> '0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a'

為什麼這些輸出不同?

更新

看來問題是當 ‘0x’ 前綴時,js 庫對事物的處理方式有所不同。

> web3.utils.sha3('255')
'0xbebb351b5cf10820d8521e899df75c3dc4c8d740dcf450f315119f5c837945c0'

在紅寶石中:

'0x' + Digest::SHA3.new(256).hexdigest('255')
=> "0xbebb351b5cf10820d8521e899df75c3dc4c8d740dcf450f315119f5c837945c0"

但隨後作為十六進制:

> web3.utils.sha3('0xff')
'0x8b1a944cf13a9a1c08facb2c9e98623ef3254d2ddb48113885c3e8e97fec8db9'

在紅寶石中:

'0x' + Digest::SHA3.new(256).hexdigest('0xff')
=> "0x420daffad4b177bce28bead5f76f7bc97ef63c3aae74c496db8ce6aafe9e6513"
'0x' + Digest::SHA3.new(256).hexdigest('ff')
=> "0x979b141b8bcd3ba17815cd76811f1fca1cabaa9d51f7c00712606970f81d6e37"

然後這對我來說更沒有意義:

> web3.utils.sha3('0x0')
'0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a'
> web3.utils.sha3('0x00')
'0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a'
> web3.utils.sha3('0x000')
'0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798'
> web3.utils.sha3('0x0000')
'0x54a8c0ab653c15bfb48b47fd011ba2b9617af01cb45cab344acd57c924d56798'
> web3.utils.sha3('0x00000')
'0x99ff0d9125e1fc9531a11262e15aeb2c60509a078c4cc4c64cefdfb06ff68647'
> web3.utils.sha3('0x000000')
'0x99ff0d9125e1fc9531a11262e15aeb2c60509a078c4cc4c64cefdfb06ff68647'

0x0 或 0x00 或 0x00000000000000000000000000000000000000000000000000000000 都只是 0,那麼為什麼這些會導致不同的摘要呢?

原來答案是提供給 ruby​​ 的 SHA3 實現的字元串格式:

'0x' + Digest::SHA3.new(256).hexdigest("\xff")

將給出與以下相同的輸出:

web3.utils.sha3('0xff');

Ruby 3 不再維護和破壞 SHA3 gem。此外,關於 SHA3 與 Keccak 的混淆也很模糊。因此,我keccak專門為乙太坊創建了一個摘要。

要生成相同的雜湊:

Digest::Keccak.new(256).hexdigest("\x0")
# => "bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a"

請注意,它無法確定0x0是字元串還是十六進制數字,並且您在問題中的雜湊是字元串文字的雜湊"0x0"

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