Solidity

我們如何能夠將 512 位雜湊作為 bytes32 變數發送?

  • August 8, 2019

我有一個有效的程式碼:

堅固性

function checkSignature(bytes32 h, uint8 v, bytes32 r, bytes32 s) public pure returns (address signer) {
   bytes memory prefix = "\x19Ethereum Signed Message:\n32";    
   bytes32 prefixedHash = keccak256(abi.encodePacked(prefix,h));  
   signer = ecrecover(prefixedHash, v, r, s); 
}

javascript

   const message = "Hello";
   const h = web3.utils.soliditySha3(message);
   console.log(h.length);
   let signature = await web3.eth.sign(h, second);

   var r = signature.slice(0, 66);
   var s = "0x" + signature.slice(66, 130);
   var v = "0x" + signature.slice(130, 132);
   v = web3.utils.toDecimal(v);
   v = v + 27;

   const result = await multisig.checkSignature(h, v, r, s);
   //result === second

的記錄長度h是 66。512 位雜湊應該是 64 字節。前 2 個字節 (0x) 表示這是一個十六進制值。

我將它作為一個固定長度為 32 的 solidity bytes32 變數發送。程式碼是如何工作的?

我可能遺漏了一些非常明顯的東西。請指出。提前致謝。

您正在使用soliditySha3,它會產生一個256-bit( 32 bytes) 雜湊,因為您的程式碼可以與bytes32.

正如您在文件中看到的, 的輸出soliditySha3類似於以下內容,長度為6664沒有0x。檢查一個字節對應兩個字元,所以結果是32 bytes.

var x = web3.utils.soliditySha3('234'); // auto detects: uint256
> "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2

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