基本概念:以太坊地址是用于在以太坊网络上接收和发送以太币(ETH)以及执行智能合约的标识符。主要特点:长度和格式:以太坊地址通常是42个字符长,以“0x”开头,后面跟随40个十六进制字符(0-9,a-f)
以太坊地址是用于在以太坊网络上接收和发送以太币(ETH)以及执行智能合约的标识符。
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
和0x742D35cC6634c0532925A3B844bC454E4438F44E
被视为相同的地址。在讨论以太坊地址的长度时,“字符”和“字节”并不是同一个意思。
字符:
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
中的每个字符都是一个十六进制字符。字节:
因此,以太坊地址的42个字符实际上对应20个字节。具体来说:
有了前面的基础铺垫,我们来看看生成以太坊地址的步骤,主要包括公钥生成、哈希处理和地址格式化:
0x56f7572f1df6e5df159ae3f8880d87b2b31b760d5b259a015e00f2eb9c91f51e
secp256k1
曲线,从私钥生成公钥。0x04
。0x049a7df67f79246283fdc93af76d4f8cdd62c4886e8cd870944e817dd9620b01df355b40c9a99da1498434b1a3de3ff98f6f0f3b962d7d67e37c1b3710a3c8d166
0x04
,得到一个64字节(512位)的数字。<!---->
0xa3f20717a250c2b0b729b7e5beca956cb2cf50e4c808034f295034f54c4f43e9
<!---->
<!---->
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
0x
开头,后面跟随40个十六进制字符。0x742d35Cc6634C0532925a3b844Bc454e4438f44e
0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed
我们可以借助一些社区好用的库,比如 @ethereumjs/wallet 来简化我们实现。
import { hdkey } from '@ethereumjs/wallet';
export function createEthAddress(
seedHex: string,
addressIndex: string
): { privateKey: string; publicKey: string; address: string } {
const seed = Buffer.from(seedHex, 'hex');
const path = `m/44'/60'/0'/0/${addressIndex}`;
const hdNode = hdkey.EthereumHDKey.fromMasterSeed(seed);
const derivedNode = hdNode.derivePath(path);
return {
privateKey: derivedNode.getWallet().getPrivateKeyString(),
publicKey: derivedNode.getWallet().getPublicKeyString(),
address: derivedNode.getWallet().getAddressString()
};
}
相关测试函数:
import { mnemonicToSeedSync } from 'bip39';
const mnemonic =
'lounge face pattern cinnamon shrug average spend rapid field cheese wrist weather';
const seed = mnemonicToSeedSync(mnemonic);
const account = createEthAddress(seed.toString('hex'), '0');
const { privateKey, address } = account;
console.log('privateKey', privateKey);
console.log('address', address); // 0x349a04e26abb45310427cee5a25ebdb84869c52e
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!