你是否曾经想过,以太坊账户是如何生成的?或者想了解如何安全地管理你的以太坊账户?本教程将为你揭开以太坊账户的奥秘,教你如何创建和管理它们。
前言:以太坊账户和银行账户
以太坊账户是存储用户以太坊余额的地方,就像银行账户一样。对于大多数普通用户来说,通常只需要一个以太坊账户来进行交易和存储以太币(ETH)。这些账户可以分为两类:外部账户和合约账户。
- 外部账户:这是普通用户拥有的账户,由私钥控制。
- 合约账户:这是一个拥有合约代码的账户,不属于任何人,也没有私钥与之关联。
在本文中,我们将专注讨论普通用户使用的外部账户,学习如何从私钥生成以太坊地址。
第一步:生成私钥
就像比特币一样,以太坊账户的私钥也是从随机数生成的,通常是一个256位的随机数。下面是一个用Node.js生成以太坊私钥的代码示例:
const randomBytes = require('randombytes');
const ethUtil = require('ethereumjs-util');
// 生成256位的随机数作为私钥:
let priKey = randomBytes(32).toString('hex');
console.log('Private key: 0x' + priKey);
这段代码使用了Node.js的randombytes
库来生成256位的随机数,并将其转换为十六进制表示的私钥。私钥是以太坊账户的核心,它用于对账户进行签名和交易。
第二步:计算公钥
公钥是从私钥派生出来的,以太坊和比特币都使用相同的ECDSA(椭圆曲线数字签名算法)和secp256k1椭圆曲线。以下是计算以太坊公钥的代码示例:
// 计算公钥(非压缩格式):
let pubKey = ethUtil.privateToPublic(new Buffer(priKey, 'hex')).toString('hex');
console.log('Public key: 0x' + pubKey);
这段代码使用以太坊的ethereumjs-util
库来将私钥转换为公钥。公钥是一个长字符串,用于验证由私钥签名的交易和消息。
第三步:生成地址
现在,我们可以使用公钥来生成以太坊地址。以太坊地址是通过对公钥进行keccak256哈希后得到的。以下是生成以太坊地址的代码示例:
// 计算地址:
let addr = ethUtil.pubToAddress(new Buffer(pubKey, 'hex')).toString('hex');
console.log('Address: 0x' + addr);
这段代码将公钥转换为以太坊地址。以太坊地址是一个40个十六进制字符的字符串,以"0x"开头。
第四步:带校验的地址
以太坊地址是一个40位的十六进制字符串,没有校验机制。这意味着如果你不小心写错了一个字符,仍然会得到一个有效的地址。为了解决这个问题,以太坊引入了带校验的地址格式,通过EIP-55实现。
带校验的地址在原始地址的基础上进行了一些修改,具体如下:
- 对地址进行keccak256哈希。
- 按位检查哈希值中是否有大于等于8的字母,如果有,将相应字母改为大写。
这个带校验的地址格式增加了地址的可读性和安全性,因为任何单个字符的错误都会导致校验失败。以下是带校验的地址的代码示例:
const ethUtil = require('ethereumjs-util');
console.log('is valid address: ' + ethUtil.isValidAddress('0x29717bf51d8afca452459936d395668a576bce66')); // true
console.log('is valid checksum address: ' + ethUtil.isValidChecksumAddress('0x29717BF51D8AFcA452459936d395668A576Bce66')); // true
console.log('is valid checksum address: ' + ethUtil.isValidChecksumAddress('0x29717BF51D8AFcA452459936d395668A576BcE66')); // false
这段代码演示了如何使用ethereumjs-util
库来检查地址的有效性以及带校验的地址是否正确。
第五步:自动搜索指定前缀的地址
如果你需要生成带有特定前缀的地址,可以使用以下代码来自动搜索并生成这样的地址:
const randomBytes = require('randombytes');
const ethUtil = require('ethereumjs-util');
// 搜索指定前缀为'0xAA...'的地址:
let prefix = '0xAA';
if (/^0x[a-fA-F0-9]{1,2}$/.test(prefix)) {
let
max = parseInt(Math.pow(32, prefix.length-2)),
qPrefix = prefix.toLowerCase().substring(2),
prettyPriKey = null,
prettyAddress = null,
priKey, pubKey, addr, cAddr, i;
for (i=0; i<max; i++) {
priKey = randomBytes(32).toString('hex');
pubKey = ethUtil.privateToPublic(new Buffer(priKey, 'hex')).toString('hex');
addr = ethUtil.pubToAddress(new Buffer(pubKey, 'hex')).toString('hex');
if (addr.startsWith(qPrefix)) {
cAddr =
ethUtil.toChecksumAddress('0x' + addr);
if(cAddr.startsWith(prefix)) {
prettyPriKey = priKey;
prettyAddress = cAddr;
break;
}
}
}
if (prettyPriKey === null) {
console.error('Not found.');
} else {
console.log('Private key: 0x' + prettyPriKey);
console.log('Address: ' + prettyAddress);
}
} else {
console.error('Invalid prefix.');
}
这段代码将自动搜索以特定前缀开头的以太坊地址,然后生成对应的私钥和带校验的地址。
第六步:HD钱包
HD(分层确定性)钱包是一种管理多个加密货币地址的方法,适用于以太坊和比特币。用户可以使用一组助记词来生成多个地址,并通过派生路径来管理这些地址。
以太坊的HD钱包派生路径是m/44'/60'/0'/0/0
。下面是一个使用助记词生成以太坊HD钱包的示例:
const bitcoin = require('bitcoinjs-lib');
const bip39 = require('bip39');
const ethUtil = require('ethereumjs-util');
// 助记词和口令:
let words = 'bleak version runway tell hour unfold donkey defy digital abuse glide please omit much cement sea sweet tenant demise taste emerge inject cause link';
let password = 'bitcoin';
// 计算seed:
let seedHex = bip39.mnemonicToSeedHex(words, password);
// 生成root:
let root = bitcoin.HDNode.fromSeedHex(seedHex);
// 生成派生key:
let child0 = root.derivePath("m/44'/60'/0'/0/0");
let prvKey = child0.keyPair.d.toString(16);
let pubKey = ethUtil.privateToPublic(new Buffer(prvKey, 'hex')).toString('hex');
let address = '0x' + ethUtil.pubToAddress(new Buffer(pubKey, 'hex')).toString('hex');
let checksumAddr = ethUtil.toChecksumAddress(address);
console.log(" prv m/44'/60'/0'/0/0: 0x" + prvKey);
console.log(" pub m/44'/60'/0'/0/0: 0x" + pubKey);
console.log(" addr m/44'/60'/0'/0/0: " + address);
console.log("check-addr m/44'/60'/0'/0/0: " + checksumAddr);
这段代码演示了如何使用助记词生成以太坊HD钱包,并派生出一个地址。
结语
现在你已经了解如何创建和管理以太坊账户了。从生成私钥到计算公钥和地址,再到带校验的地址和HD钱包,你已经掌握了关键步骤。记住保护好你的私钥,因为它是你账户的唯一访问凭证。
希望这篇教程对你有所帮助,让你更了解以太坊账户的工作原理和创建方法。