Web3js
keccak256 輸出在 ruby 和 javascript 上是不同的…?
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"
。