第7章 以太坊账户与钱包基础
const account = web3.eth.accounts.create();
console.log(account);
/* ↳
{
address: '0x9E82491d1978217d631a3b467BF912933F54788f',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
}
*/
// use the account to sign a message
const signature = account.sign('Hello, Web3.js!');
/* ↳
{
message: 'Hello, Web3.js!',
messageHash: '0xc0f5f7ee704f1473acbb7959f5f925d787a9aa76dccc1b4914cbe77c09fd68d5',
v: '0x1b',
r: '0x129822b685d4404924a595af66c9cdd6367a57c66ac66e2e10fd9915d4772fbd',
s: '0x62db48d6f5e47fe87c64a0991d6d94d23b6024d5d8335348f6686b8c46edb1e9',
signature: '0x129822b685d4404924a595af66c9cdd6367a57c66ac66e2e10fd9915d4772fbd62db48d6f5e47fe87c64a0991d6d94d23b6024d5d8335348f6686b8c46edb1e91b'
}
*/
请注意,由于每次执行代码时都会创建一个新账户,因此这些值每次都会不同。
除了生成新的随机账户外,Account 包还可以用于从私钥加载现有账户,示例代码如下:
// 从私钥加载现有账户
const account = web3.eth.accounts.privateKeyToAccount('<redacted>');
console.log(account);
/* ↳
{
address: '0x9E82491d1978217d631a3b467BF912933F54788f',
privateKey: '<redacted>',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
}
*/
// 使用该账户签署消息
const signature = account.sign('Hello, Web3.js!');
/* ↳
{
message: 'Hello, Web3.js!',
messageHash: '0xc0f5f7ee704f1473acbb7959f5f925d787a9aa76dccc1b4914cbe77c09fd68d5',
v: '0x1b',
r: '0x129822b685d4404924a595af66c9cdd6367a57c66ac66e2e10fd9915d4772fbd',
s: '0x62db48d6f5e47fe87c64a0991d6d94d23b6024d5d8335348f6686b8c46edb1e9',
signature: '0x129822b685d4404924a595af66c9cdd6367a57c66ac66e2e10fd9915d4772fbd62db48d6f5e47fe87c64a0991d6d94d23b6024d5d8335348f6686b8c46edb1e91b'
}
*/
Account 方法
以下是 web3.eth.accounts 包中 Account 方法的列表,包含描述和使用示例:
- create
- decrypt
- encrypt
- hashMessage
- parseAndValidatePrivateKey
- privateKeyToAccount
- privateKeyToAddress
- privateKeyToPublicKey
- recover
- recoverTransaction
- sign
- signRaw
- signTransaction
Wallets
Web3.js 的钱包是账户的集合,由 Wallet 类表示。当钱包用于跟踪某个账户时,该账户会被添加到内部上下文(即 Web3Context)中,以便日后更轻松地使用该账户——这在交易教程中会有更详细的说明。以下示例展示了如何创建一个包含两个新随机账户的钱包,并使用第二个账户签署一条消息:
// 创建一个包含 2 个新随机账户的钱包
const wallet = web3.eth.accounts.wallet.create(2);
console.log(wallet);
/* ↳
Wallet(2) [
{
address: '0xaaD0d33dc9800258c1265bdDA47b9266472144F7',
privateKey: '<redacted>',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
{
address: '0x359caa845324802C64B97544460F31fba4f9B9ba',
privateKey: '<redacted>',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(2) {
'0xaad0d33dc9800258c1265bdda47b9266472144f7' => 0,
'0x359caa845324802c64b97544460f31fba4f9b9ba' => 1
},
_defaultKeyName: 'web3js_wallet'
]
*/
// 使用钱包中的第二个账户对消息进行签名
const signature = wallet[1].sign('Hello, Web3.js!');
// 也可以访问钱包账户使用 "at" 和 "get" 方法
// wallet.at(1).sign("Hello, Web3.js!")
// wallet.get(1).sign("Hello, Web3.js!")
console.log(signature);
/* ↳
{
message: 'Hello, Web3.js!',
messageHash: '0xc0f5f7ee704f1473acbb7959f5f925d787a9aa76dccc1b4914cbe77c09fd68d5',
v: '0x1c',
r: '0xd90fc42ff83fdf0ec6778c1c27f3051439de7844eacf06195c761fece19ed77d',
s: '0x729693156c48d07df9f4970772049dbe24ebce979765f788974a13c318b2834a',
signature: '0xd90fc42ff83fdf0ec6778c1c27f3051439de7844eacf06195c761fece19ed77d729693156c48d07df9f4970772049dbe24ebce979765f788974a13c318b2834a1c'
}
*/
注意,由于每次执行代码都会创建新账户,其中许多值在每次运行时都会改变。
除了生成新的随机账户,钱包还可以用于通过私钥加载现有账户,如以下代码片段所示:
// 创建包含单个现有账户的钱包
const wallet = web3.eth.accounts.wallet.add('
console.log(wallet);
/* ↳
Wallet(1) [
{
address: '0xC978F87516152f542dc4D6f64C810B0c206b11A8',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(1) { '0xc978f87516152f542dc4d6f64c810b0c206b11a8' => 0 },
_defaultKeyName: 'web3js_wallet'
]
*/
可以向现有钱包中添加新账户,如以下代码片段所示:
// 创建包含单个随机账户的钱包
const wallet = web3.eth.accounts.wallet.create(1);
console.log(wallet);
/* ↳
Wallet(1) [
{
address: '0x6680D50C2165e8F1841D9CdaA42C2F1b949a39f2',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(1) { '0x6680d50c2165e8f1841d9cdaa42c2f1b949a39f2' => 0 },
_defaultKeyName: 'web3js_wallet'
]
*/
// 用钱包的 "create" 方法添加一个新账户
wallet.create(1);
console.log(wallet);
/* ↳
Wallet(2) [
{
address: '0x6680D50C2165e8F1841D9CdaA42C2F1b949a39f2',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
{
address: '0x5eD8a3ED6Bb1f32e4B479380cFAcf43C49a5440A',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(2) {
'0x6680d50c2165e8f1841d9cdaa42c2f1b949a39f2' => 0,
'0x5ed8a3ed6bb1f32e4b479380cfacf43c49a5440a' => 1
},
_defaultKeyName: 'web3js_wallet'
]
*/
// 创建一个新账户并添加到钱包
const newAccount = web3.eth.accounts.create();
wallet.add(newAccount);
console.log(wallet);
/* ↳
Wallet(3) [
{
address: '0x6680D50C2165e8F1841D9CdaA42C2F1b949a39f2',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
{
address: '0x5eD8a3ED6Bb1f32e4B479380cFAcf43C49a5440A',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
{
address: '0x3065Cf410Bd6A10c5FF3Df8f60b82fF5Ee5db18a',
privateKey: '
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(3) {
'0x6680d50c2165e8f1841d9cdaa42c2f1b949a39f2' => 0,
'0x5ed8a3ed6bb1f32e4b479380cfacf43c49a5440a' => 1,
'0x3065cf410bd6a10c5ff3df8f60b82ff5ee5db18a' => 2
},
_defaultKeyName: 'web3js_wallet'
]
*/
Wallet 方法 以下是 web3.eth.accounts.wallet 包中 Wallet 方法的列表,包含说明及用法示例: add clear create decrypt encrypt get load remove save getStorage 下一步 本文档仅是对 Web3.js 账户和钱包的简介。以下是建议的后续学习内容: 学习如何将 ETH 从一个账户转账到另一个账户。 构建使用 MetaMask 钱包注入账户的前端应用。 使用账户部署智能合约并进行交互。