Addresses
在 C# 中生成乙太坊地址
我按照此處的說明從頭開始生成有效的乙太坊地址。我正在使用 BouncyCastle 的 secp256k1 來執行 privkey –> pubkey,但我不知道在哪裡可以為 C# 正確實現 keccak 來執行最後一步 pubkey –> 地址。誰能幫我這個?
BouncyCastle KeccakDigest 返回的結果與針對同一 pubkey 的說明中的結果不同。
BouncyCastle KeccakDigest 似乎確實有效:https ://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Util/Sha3Keccack.cs
public byte[] CalculateHash(byte[] value) { var digest = new KeccakDigest(256); var output = new byte[digest.GetDigestSize()]; digest.BlockUpdate(value, 0, value.Length); digest.DoFinal(output, 0); return output; }
生成地址的完整過程可以通過https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Signer/EthECKey.cs中的程式碼來理解,特別是
public string GetPublicAddress() { var initaddr = new Sha3Keccack().CalculateHash(GetPubKeyNoPrefix()); var addr = new byte[initaddr.Length - 12]; Array.Copy(initaddr, 12, addr, 0, initaddr.Length - 12); return new AddressUtil().ConvertToChecksumAddress(addr.ToHex()); }
它通常很簡單:
- 生成隨機 32 字節(並使用 secp256k1lib 驗證它們是否是有效的私鑰)(記得使用安全隨機生成器)
- 使用 secp256k1 操作(使用 secp256k1lib 或 Bouncy Castle)計算公鑰。
- 在公鑰的 64 字節上計算 Keccak 雜湊。
- 獲取 Keccak 雜湊的最後 20 個字節
- 地址的大小寫無關緊要,但如果您想遵守規則,那麼您可能需要查看EIP55
你可以查看 Nethermind 的實現——它使用 secp256k1lib 而不是 Bouncy Castle。
請注意,在創建私鑰時,您希望確保它們已從記憶體中清除並且通常難以被攔截。Nethermind(和許多其他現有實現)尚未(截至 2018 年 9 月)以適當的安全性處理該問題,因此僅將其用作參考。