Addresses
從 Solidity 中的公鑰獲取地址
地址是最後 20 個字節
sha3(publicKey)
在 Solidity 中,如果需要使用彙編,我如何拼接前 12 個字節
sha3(publicKey)
並獲取地址?我想出的氣體用完了:bytes32 b = sha3(publicKey) address signer; assembly { signer := mload(add(b, 0x0c) // skip the first 12 bytes, 0c in hex = 12 }
MLOAD(0XAB) 載入位於記憶體地址 0XAB 的字(32 字節)。我的函式是否因為嘗試僅載入 20 字節而失敗?MLOAD 只能載入 20 字節嗎?
這有效:
return address(keccak256(publicKey) & (2**(8*21)-1));
2**(8*21)-1
只是獲得 0xFFFFFF… (40 Fs) 而不輸入它的技巧。:-)編輯
正如@schnorr 所指出的,不需要面具:
return address(keccak256(publicKey));
從如何在 Solidity 中將字節轉換為地址的答案?以及如何連接 bytes32的答案$$ $$數組到字元串?,我想出了這個將 a 轉換
bytes32 keyHash
為地址的方法。function getAddressFromPublicKey(bytes _publicKey) returns (address signer) { // Get address from public key bytes32 keyHash = keccak256(_publicKey); uint result = 0; for (uint i = keyHash.length-1; i+1 > 12; i--) { uint c = uint(keyHash[i]); uint to_inc = c * ( 16 ** ((keyHash.length - i-1) * 2)); result += to_inc; } return address(result); }