Sha3

如何通過在nodejs上提供與輸入相同的地址來使用sha3獲得相同的輸出?

  • December 26, 2017

我有以下契約:

pragma solidity ^0.4.0;

contract Lottery {
 address public owner;
 bytes32 public hash;

 function Lottery() {        
   owner = msg.sender;
   hash = sha3(owner);
 }

 function get() constant returns (address, bytes32) {
   return (owner, hash);
 }
}

返回:

{
   "0": "address: 0xca35b7d915458ef540ade6068dfe2f44e8fa733c",
   "1": "bytes32: 0xb1591967aed668a4b27645ff40c444892d91bf5951b382995d4d4f6ee3a2ce03"
}

我想bytes32 hash通過nodejs提供與"address: 0xca35b7d915458ef540ade6068dfe2f44e8fa733c".


我擁有的javascript程式碼:

module.exports = require('js-sha3');

Web3 = require("web3");
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

if(!web3.isConnected()){
   console.log("not connected");
   process.exit();
}

var owner = "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"; //given input on the smart-contract.

has=web3.sha3(owner);
console.log(hash)

哪個列印:

0d87bf1419ed1b24bad65bbf117fcaded953923cb4eff8ca80bcde0aacb97357

這與我在solidity 上得到的輸出不同。

**$$ Q $$**我應該怎麼做才能sha3通過在nodejs上提供與輸入相同的地址來獲得相同的輸出?

感謝您寶貴的時間和幫助。

您需要先解析地址。現在,您正在計算地址的字元串表示形式的雜湊值。試試這個:

> web3.utils.sha3(new Buffer('0xca35b7d915458ef540ade6068dfe2f44e8fa733c'.substr(2), 'hex'))
'0xb1591967aed668a4b27645ff40c444892d91bf5951b382995d4d4f6ee3a2ce03'

(注意將.substr(2)地址"0x"開頭的 去掉。)

編輯

另外一個選項:

> web3.utils.sha3(web3.utils.hexToBytes('0xca35b7d915458ef540ade6068dfe2f44e8fa733c'))
'0xb1591967aed668a4b27645ff40c444892d91bf5951b382995d4d4f6ee3a2ce03'

編輯 2

以上是web3.js1.0.0-beta.x。對於web3.js0.xx(我用 0.14.0 測試過):

> web3.sha3('0xca35b7d915458ef540ade6068dfe2f44e8fa733c', { encoding: 'hex' })
'b1591967aed668a4b27645ff40c444892d91bf5951b382995d4d4f6ee3a2ce03'

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