Solidity
我們如何能夠將 512 位雜湊作為 bytes32 變數發送?
我有一個有效的程式碼:
堅固性
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
類似於以下內容,長度為66
,64
沒有0x
。檢查一個字節對應兩個字元,所以結果是32 bytes
.var x = web3.utils.soliditySha3('234'); // auto detects: uint256 > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2