Addresses

從 Solidity 中的公鑰獲取地址

  • May 7, 2020

地址是最後 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);
}

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