主页 > imtoken钱包官方网址 > 以太坊教程 - 账户

以太坊教程 - 账户

imtoken钱包官方网址 2023-01-17 01:55:59

以太坊账户负责存储用户的以太坊余额。 对于大多数普通用户来说,以太坊账户与银行账户非常相似,通常只需要一个账户。

准确的说,以太坊账户分为外部账户和合约账户两种:

本节我们只讨论普通用户使用的外部账户。

与比特币类似,以太坊账户是通过散列公钥获得的地址。 它从一个私钥推导出对应的公钥,然后计算出地址。 其中,私钥和公钥算法与比特币完全一样,都是secp256k1椭圆曲线,但与比特币不同的是,以太坊使用的是非压缩公钥,然后直接对公钥进行keccak256哈希得到32字节哈希值,最后20个字节加上0x前缀就是地址:

以太坊为什么叫以太坊_以太坊的算力计算_以太坊根据地址计算私钥

代码实现如下:

const    randomBytes = require('randombytes'),    ethUtil = require('ethereumjs-util');// 生成256bit的随机数作为私钥:let priKey = randomBytes(32).toString('hex');// 计算公钥(非压缩格式):let pubKey = ethUtil.privateToPublic(new Buffer(priKey, 'hex')).toString('hex');// 计算地址:let addr = ethUtil.pubToAddress(new Buffer(pubKey, 'hex')).toString('hex');

console.log('Private key: 0x' + priKey);console.log('Public key: 0x' + pubKey);console.log('Address: 0x' + addr);

与使用 Base58 或 Bech32 编码的比特币不同,以太坊对私钥和地址使用十六进制编码,因此它没有任何验证。 如果某位写错了,它仍然是一个有效的私钥或地址。

keccak256哈希算法在以太坊中也被称为SHA3算法,但需要注意的是keccak算法最初是SHA3的候选算法。 然而,在 SHA3 的最终标准化过程中,keccak 得到了改进。 所以,标准的SHA3算法和keccak是不同的,但是以太坊在发展的时候选择了还没有成为SHA3标准的keccak算法。 后面我们讨论以太坊的哈希算法时,总会用keccak256来代替SHA3-256。

带校验和的地址

因为以太坊的地址是原始哈希的最后20字节,并且是用16进制表示的以太坊根据地址计算私钥,这种方法简单粗暴,但是没有校验。 地址中的任何数字错误仍然是有效地址。 为了防止复制错误,以太坊通过EIP-55实现了一种带有校验和的地址格式。 它的实现很简单,就是对地址​​做一次keccak256哈希,然后按位对齐,哈希值>=8的字母变成大写:

original addr = 0x29717bf51d8afca452459936d395668a576bce66
keccak hash = e72ecce2eb2ed0ffab5e05f043ee68fab3df759d...
checksum addr = 0x29717BF51D8AFcA452459936d395668A576Bce66

因此,以太坊地址是通过部分大写字母来验证的。 它的优点是验证地址和不验证地址对于钱包软件来说格式是一样的。 缺点是有小概率无法验证。 验证所有小写的地址。

const ethUtil = require('ethereumjs-util');console.log('is valid address: ' + ethUtil.isValidAddress('0x29717bf51d8afca452459936d395668a576bce66')); // trueconsole.log('is valid checksum address: ' + ethUtil.isValidChecksumAddress('0x29717BF51D8AFcA452459936d395668A576Bce66')); // trueconsole.log('is valid checksum address: ' + ethUtil.isValidChecksumAddress('0x29717BF51D8AFcA452459936d395668A576BcE66')); // false

高清钱包

因为以太坊和比特币的非对称加密算法是完全一样的,区别只是公钥和地址的表示格式,所以比特币的HD钱包系统也完全适用于以太坊。 通过一组助记词,用户可以同时管理比特币钱包和以太坊钱包。

以太坊钱包的推导路径为m/44'/60'/0'/0/0,代码实现如下:

const    bitcoin = require('bitcoinjs-lib'),    bip39 = require('bip39'),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',    password = 'bitcoin';

// 计算seed:let seedHex = bip39.mnemonicToSeedHex(words, password);console.log('seed: ' + seedHex); // b59a8078...c9ebfaaa

// 生成root:let root = bitcoin.HDNode.fromSeedHex(seedHex);console.log('xprv: ' + root.toBase58()); // xprv9s21ZrQH...uLgyr9kFconsole.log('xpub: ' + root.neutered().toBase58()); // xpub661MyMwA...oy32fcRG

// 生成派生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); // 0x6c03e50ae20af44b9608109fc978bdc8f081e7b0aa3b9d0295297eb20d72c1c2console.log(" pub m/44'/60'/0'/0/0: 0x" + pubKey); // 0xff10c2376a9ff0974b28d97bc70daa42cf85826ba83e985c91269e8c975f75f7d56b9f5071911fb106e48b2dbb2b30e0558faa2fc687a813113632c87c3b051cconsole.log(" addr m/44'/60'/0'/0/0: " + address); // 0x9759be9e1f8994432820739d7217d889918f2f07console.log("check-addr m/44'/60'/0'/0/0: " + checksumAddr); // 0x9759bE9e1f8994432820739D7217D889918f2f07

由于以太坊采用账户余额模型,通常一个以太坊地址就足够了。 如果想生成多个地址,可以继续推导出m/44'/60'/0'/0/1、m/44'/60'/0'/0/2等。

概括

以太坊的私钥和公钥使用与比特币相同的ECDSA算法和secp256k1曲线,可以复用比特币的HD钱包助记词;

以太坊的地址使用非压缩公钥的keccak256哈希后的20字节以太坊根据地址计算私钥,使用16进制编码,可以通过大小写字母来验证地址。

访问以获取更多区块链教程