如何创建和管理以太坊账户:从私钥到地址

你是否曾经想过,以太坊账户是如何生成的?或者想了解如何安全地管理你的以太坊账户?本教程将为你揭开以太坊账户的奥秘,教你如何创建和管理它们。

前言:以太坊账户和银行账户

以太坊账户是存储用户以太坊余额的地方,就像银行账户一样。对于大多数普通用户来说,通常只需要一个以太坊账户来进行交易和存储以太币(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实现。

带校验的地址在原始地址的基础上进行了一些修改,具体如下:

  1. 对地址进行keccak256哈希。
  2. 按位检查哈希值中是否有大于等于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钱包,你已经掌握了关键步骤。记住保护好你的私钥,因为它是你账户的唯一访问凭证。

希望这篇教程对你有所帮助,让你更了解以太坊账户的工作原理和创建方法。

声明:本站所有文章,如无特殊说明或标注,均为本站(王大神)原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
教程

从零开始搭建和运行一个小型AI模型

2023-9-21 16:14:17

教程

深入了解以太坊区块结构与数据存储

2023-9-21 16:20:48

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索