news 2026/2/16 22:56:08

Web3.js钱包与账户管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Web3.js钱包与账户管理

简介

Web3.jsWallet是我们在想要直接使用私钥进行任何区块链操作(交易)时的主要入口点,在其它库中也被称为Signer

与其它只能保存一个账户的库不同,Web3.jsWallet可以保存多个账户,每个账户都有它自己的私钥和地址。因此,无论这些密钥是在计算机的内存中还是由MetaMask保护,Wallet都使以太坊任务变得安全且简单。

imtoken



比特派, Bitpie



TP,token pocket, TP wallet

web3-eth-accounts包中包含了生成Ethereum账户、签名交易和数据的函数。

在以太坊中,私钥是用于保护和控制以太坊地址所有权的加密密钥对中的关键部分。在公钥加密系统中,每个以太坊地址都有一对匹配的公钥和私钥。这个密钥对让我们能够拥有一个以太坊地址,管理资金,并发起交易。

关于钱包的更多介绍,详见这里[2]。

我们可以通过不同的方式签署和发送交易:

•本地钱包[3](强烈推荐)•节点钱包[4](已弃用

对于它们中的每一个,我们都可以使用Web3PromiEvent[5]来捕捉额外的交易事件。

钱包 vs 账户

在web3.js中,账户是一个对象,它指的是一个带有相关公钥和私钥的单独以太坊地址。而钱包是用于管理多个账户的高级结构,单个以太坊地址被视为一个账户。

代码语言:javascript

AI代码解释

/* 创建新账户 */ const account = web3.eth.accounts.create(); console.log(account) /* ↳ { address: '0x9E82491d1978217d631a3b467BF912933F54788f', privateKey: '0x4651f9c219fc6401fe0b3f82129467c717012287ccb61950d2a8ede0687857ba', signTransaction: [Function: signTransaction], sign: [Function: sign], encrypt: [Function: encrypt] } */

在 web3.js 中,钱包是一个包含多个以太坊账户的数组。它提供了一种方便的方式来管理一系列账户并与之进行交互。可以将其视为用于存储和组织各种以太坊地址的数字钱包。

代码语言:javascript

AI代码解释

/* 创建新的钱包 */ //create a wallet with `1` random account const wallet = web3.eth.accounts.wallet.create(1); console.log(wallet) /* ↳ Wallet(1) [ { address: '0xB2D5647C03F36cA54f7d783b6Fa5afED297330d4', privateKey: '0x7b907534ec13b19c67c2a738fdaa69014298c71f2221d7e5dec280232e996610', signTransaction: [Function: signTransaction], sign: [Function: sign], encrypt: [Function: encrypt] }, _accountProvider: { create: [Function: createWithContext], privateKeyToAccount: [Function: privateKeyToAccountWithContext], decrypt: [Function: decryptWithContext] }, _addressMap: Map(1) { '0xb2d5647c03f36ca54f7d783b6fa5afed297330d4' => 0 }, _defaultKeyName: 'web3js_wallet' ] */

示意图

想了解更多accounts方法,可以访问web3.js accounts API[6]。

想了解更多wallet方法,可以访问web3.js wallet API[7]。

发送交易

这件事最简单的方法是直接通过添加一个私钥(私钥必须以'0x'开头,并且必须有资金来执行交易)来创建一个Wallet

代码语言:javascript

AI代码解释

/* 使用添加私钥的方式来发送交易 */ import { Web3 } from 'web3'; const web3 = new Web3('https://ethereum-sepolia.publicnode.com'); //this will create an array `Wallet` with 1 account with this privateKey //it will generate automatically a public key for it //make sure you have funds in this accounts const wallet = web3.eth.accounts.wallet.add('0x152c39c430806985e4dc16fa1d7d87f90a7a1d0a6b3f17efe5158086815652e5'); const _to = '0xc7203efeb54846c149f2c79b715a8927f7334e74'; const _value = '1'; //1 wei //the `from` address in the transaction must match the address stored in our `Wallet` array //that's why we explicitly access it using `wallet[0].address` to ensure accuracy const receipt = await web3.eth.sendTransaction({ from: wallet[0].address, to: _to, value: _value, }); //if you have more than 1 account, you can change the address by accessing to another account //e.g, `from: wallet[1].address` console.log('Tx receipt:', receipt); /* ↳ Tx receipt: { blockHash: '0xa43b43b6e13ba47f2283b4afc15271ba07d1bba0430bd0c430f770ba7c98d054', blockNumber: 4960689n, cumulativeGasUsed: 7055436n, effectiveGasPrice: 51964659212n, from: '0xa3286628134bad128faeef82f44e99aa64085c94', gasUsed: 21000n, logs: [], logsBloom: '0x00000...00000000', status: 1n, to: '0xc7203efeb54846c149f2c79b715a8927f7334e74', transactionHash: '0xb88f3f300f1a168beb3a687abc2d14c389ac9709f18b768c90792c7faef0de7c', transactionIndex: 41n, type: 2n } */

与合约进行交互

写函数

要与修改或更新智能合约中数据的功能(写入功能)进行交互,我们需要创建一个Wallet。这个钱包至少必须持有一个帐户,且该帐户中必须有执行这些区块链操作所需的资金。

代码语言:javascript

AI代码解释

/* 调用智能合约的写函数 */ import { Web3 } from 'web3'; const web3 = new Web3('https://ethereum-sepolia.publicnode.com'); //create a wallet const wallet = web3.eth.accounts.wallet.add('0x152c39c430806985e4dc16fa1d7d87f90a7a1d0a6b3f17efe5158086815652e5'); //this is how we can access to the first account of the wallet console.log('Account 1:', wallet[0]); /* ↳ Account 1: { address: '0x57CaabD59a5436F0F1b2B191b1d070e58E6449AE', privateKey: '0x152c39c430806985e4dc16fa1d7d87f90a7a1d0a6b3f17efe5158086815652e5', ... } */ //instantiate the contract const myContract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); //interact with the contract //wallet[0].address == '0x57CaabD59a5436F0F1b2B191b1d070e58E6449AE' const txReceipt = await myContract.methods.doSomething().send({ from: wallet[0].address }); console.log('Transaction receipt:', txReceipt); /* ↳ Transaction receipt: {...} */
读函数(查看)

要与查看智能合约的public/external returns进行交互,我们不需要实例化一个钱包,我们可以仅通过实例化智能合约和提供者来实现。

代码语言:javascript

AI代码解释

/* 调用智能合约的读函数 */ import { Web3 } from 'web3'; //instantiate the provider const web3 = new Web3('https://ethereum-sepolia.publicnode.com'); //instantiate the contract const myContract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); //call the `view function` in the contract const result = await myContract.methods.doSomething().call(); console.log('Result:', result) /* ↳ Result: ... */

钱包方法

下面罗列出web3.th.accounts.wallet包中提供的Wallet方法[8]:

•add[9]:使用私钥或者账户对象添加一个账户到钱包中。•clear[10]:安全地清空钱包并移除其中的所有账户。谨慎使用,因为该操作会删除本地钱包中的所有账户。•create[11]:在钱包中生成一个或多个账户。如果钱包已存在,它们并不会被覆盖。•decrypt[12]:解密keystore v3对象。•encrypt[13]:加密钱包中的所有账户到一个已加密的keystore v3对象中。•get[14]:获取指定账户在钱包中的索引或其公钥地址。•load[15]:从本地存储中导入钱包并对其解密。注意:仅浏览器支持。•remove[16]:从钱包中移除指定账户。•save[17]:以字符串的形式将加密后的钱包存储到本地存储中。注意:仅浏览器支持。•getStorage[18]:获取浏览器的存储对象。

账户方法

下面罗列出web3.th.accounts包中提供的Accounts方法[19]:

•create[20]:生成并返回一个包括私钥和公钥的Web3Account对象。在创建私钥时,它使用了一个经过审计的包ethereum-cryptography/secp256k1,该包是具有特定特性的加密安全随机数。了解更多:https://www.npmjs.com/package/ethereum-cryptography#secp256k1-curve•decrypt[21]:解密 v3 keystore JSON,并创建账户。•encrypt[22]:使用密码加密私钥并返回一个V3 JSON Keystore,详见https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition。•hashMessage[23]:将给定的消息进行哈希处理。数据将被UTF-8 HEX解码并按以下方式封装:“\x19Ethereum Signed Message:\n” + 消息长度 + 消息,并使用keccak256进行哈希处理。•parseAndValidatePrivateKey[24]:获取验证后的私钥 Uint8Array。注意:此功能不通过主web3包导出,因此要直接使用它,请从账户包中导入。•privateKeyToAccount[25]:从私钥中获取账户。•privateKeyToAddress[26]:从私钥中获取以太坊地址。•privateKeyToPublicKey[27]:从私钥中获取公钥。•recover[28]:恢复用于签署给定数据的以太坊地址。•recoverTransaction[29]:恢复用于签署给定RLP编码交易的以太坊地址。•sign[30]:使用私钥对给定的任意数据进行签名。•signTransaction[31]:使用私钥对给定的以太坊交易进行签名。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/15 16:29:15

leetcode 2147. 分隔长廊的方案数 困难

在一个图书馆的长廊里,有一些座位和装饰植物排成一列。给你一个下标从 0 开始,长度为 n 的字符串 corridor ,它包含字母 S 和 P ,其中每个 S 表示一个座位,每个 P 表示一株植物。在下标 0 的左边和下标 n - 1 的右边 已…

作者头像 李华
网站建设 2026/2/15 16:29:07

学生党必备!这款桌面课表工具太省心了

上课前翻遍手机找课表?担心走神错过上课时间?对于学生党和老师来说,一款顺手的课表工具能省不少事!今天电脑天空要给大家安利的「桌面课表 Class Widget」,就是这样一款精准解决课程管理痛点的桌面小工具。它最戳人的点…

作者头像 李华
网站建设 2026/2/15 16:28:57

深度学习实验14代码

实验前准备 数据集 # make data import random import numpy as np import os # 固定随机种子 random.seed(0) np.random.seed(0)def generate_data(length, k, save_path):if length < 3:raise ValueError("The length of data should be greater than 2.")if k …

作者头像 李华
网站建设 2026/2/15 16:28:46

优化及性能-–-behaviac

原文 优化及性能 宏BEHAVIAC_RELEASE定义的时候是最终版&#xff0c;BEHAVIAC_RELEASE没有定义的时候是为开发版。 在debug版中&#xff0c;BEHAVIAC_RELEASE缺省下没有定义的。诸如logging、socketing、热加载等开发功能是有效的。可以通过behaviac::Config::IsLogging和be…

作者头像 李华
网站建设 2026/2/15 16:28:00

练题100天——DAY26:汇总区间+丢失的数字+数组交集

今天又又是三道题&#xff0c;难度范围&#xff1a;★★~★★★。难度完全是凭个人做的感觉标的&#xff0c;题还是得自己做了才知道。 100天也已经过1/4了&#xff0c;非常之不错啊&#xff0c;希望这些记录能让我对这些题的理解更深&#xff0c;当然&#xff0c;也希望能对你…

作者头像 李华
网站建设 2026/2/15 16:27:33

当AI芯片不再性感:博通的高增长,为何成了催命符?

出品I下海fallsea撰文I胡不知2025年12月12日16点03分&#xff0c;纳斯达克交易大厅的电子屏突然泛起红光。博通&#xff08;AVGO.US&#xff09;的股价在连续30分钟的抛售潮中直线下坠&#xff0c;从开盘402美元跌至357美元&#xff0c;单日跌幅最终定格在11.2%&#xff0c;市值…

作者头像 李华