以太坊上钱包开发示例:创建账户,余额获取和转账
整个实现过程:首先创建一个账户,得到新账户的address和privatekey两个值,现在获取到的余额肯定是0,从metamask里面给新建的账户转点钱,再次获取余额。然后再从新建的账户给metamask转点钱。
有一些基本知识:Metamask是一个流行的加密货币钱包和浏览器扩展,主要用于管理以太坊(Ethereum)及其上运行的数字资产和去中心化应用(DApps)。它充当了用户与以太坊区块链之间的桥梁,允许用户轻松进行交易、存储和管理加密货币。刚开始metamask上肯定是没有钱的,这就需要我们往里面转钱,可以通过欧易往真实的以太坊主网(Ethereum Mainnet)上充钱,也可以通过Sepolia-faucet挖矿往以太坊测试网(Sepolia)上充测试币。当然也有一些别的测试网络可以选择,我这里用的是Sepolia。
转账过程中需要知道两个概念gas和gasprice:Gas 是以太坊网络中用于衡量执行特定操作或智能合约所需计算工作量的单位。每个操作(如转账、部署智能合约、调用函数等)都有对应的 gas 消耗量。Gas price 是你愿意为每个单位的 gas 支付的价格,通常以 Gwei(1 Gwei = 0.000000001 Ether)为单位。Gwei 是 Ether 的十亿分之一。假设你有一个简单的转账操作,消耗 21,000 gas,你设置的 gas price 是 50 Gwei。那么,这次转账的总费用将是:总费用=21,000?gas×50?Gwei/gas=1,050,000?Gwei=1.05?Ether总费用=21,000gas×50Gwei/gas=1,050,000Gwei=1.05Eth
我这个测试代码里,要从我自己新建的账户给metamask转账,就是先从网络上获取现在的Gas price,乘以最小的gas限额,就可以算出总费用,这个费用一定要小于你现在账户里面的数值,当然在代码实现时,要注意把所有的数值使用BigInt() 进行转换,确保所有涉及运算的数值保持一致性。
1,创建账户
npm install web3import Web3 from "web3";//创建 Web3 实例,优先使用 Web3.givenProvider(如浏览器扩展),否则使用 Infura 提供的 WebSocket端点连接Sepolia测试网络var web3= new Web3(Web3.givenProvider||"wss://sepolia.infura.io/ws/v3/401c8c4fc37440068881de3787afcd91");// 创建新的以太坊账户,使用 '123' 作为种子生成私钥和地址const account=web3.eth.accounts.create("123");console.log(account);
得到的账户主要包括address和privatekey两个值。每跑一次程序就会新生成一个账户,所以跑一次就把账户记下来,把这段代码注释掉
2,余额获取
现在获取到的余额肯定是0,需要往里面转点测试币。
var web3 = new Web3(Web3.givenProvider || "wss://sepolia.infura.io/ws/v3/401c8c4fc37440068881de3787afcd91");// 输出提供者的信息,确认连接到正确的网络console.log("Given provider is", Web3.givenProvider);console.log("Web3 instance:", web3);// 检查WebSocket是否连接成功web3.eth.net.isListening().then(() => console.log('Web3 connected via WebSocket!')).catch(e => console.log('Failed to connect via WebSocket:', e));// 创建以太坊地址的引用const address = ref("0x0e5B745F6621fbe013f5178f6E9F0114cE044a00");const mount = ref(-1);console.log("Address is", address.value);// 获取余额web3.eth.getBalance(address.value).then((res) => {console.log("Balance in Wei:", res); // 输出原始的余额(Wei单位)mount.value = web3.utils.fromWei(res, 'ether'); // 转换成以太币单位console.log("Balance in Ether:", mount.value); // 确保在异步操作完成后输出}).catch(err => {console.error("Error fetching balance:", err); // 捕获错误并输出});3,转账
从新建的账户往metamask里面转测试币
const send = async() =>{const valueToSend = BigInt(web3.utils.toWei('0.00000001', 'ether')); // 发送0.1 ETHvalueToSend=10000000Weiconst nonce = await web3.eth.getTransactionCount(address.value); // nonce是地址的交易次数,用于确保交易顺序。console.log("Nonce:", nonce);const gasPrice = BigInt(await web3.eth.getGasPrice());// 获取当前 gas 价格console.log("gasPrice value is", gasPrice.toString());//gasPrice value is 6404208594const gasLimit = BigInt(21000);const gasFee = BigInt(gasPrice)* gasLimit;console.log("gasFee value is", gasFee.toString());//gasFee value is 134488380474000const totalValue = valueToSend + gasFee;console.log("totalValue value is", totalValue);//totalValue value is 134498380474000nconst balance = BigInt(await web3.eth.getBalance(address.value));console.log("balance value is", balance);//balance value is 165482219930039000nif (balance < totalValue) {throw new Error("Insufficient funds for transfer");}const tx = {from: address.value,// 发送方地址to: "0xF2FB8e02B042d97B32618061b698D6A2B10fEaEb",// 接收方地址value: web3.utils.toHex(valueToSend),gas: web3.utils.toHex(21000), // 发送 ETH 的最小 gas 限额gasPrice: web3.utils.toHex(gasPrice),nonce: web3.utils.toHex(nonce)};const priKey = Buffer.from(privateKey.value.slice(2), "hex");const gas=await web3.eth.estimateGas(tx);console.log("estimateGasPrice value is", gas);//estimateGasPrice value is 21000ntx.gas = web3.utils.toHex(gas);console.log("estimateGasPricetoHex value is", tx.gas);//estimateGasPricetoHex value is 0x5208const newtx=new Tx(tx);console.log("newtx value is", newtx);newtx.sign(priKey);const serializedTX = '0x' + newtx.serialize().toString("hex");console.log("serialiazedTX value is", serializedTX);const trans=web3.eth.sendSignedTransaction(serializedTX);trans.on("transactionHash",(txid)=>{console.log("交易id",txid);});trans.on("receipt",(res)=>{console.log("第一个节点确认",res);});trans.on("confimation",(res)=>{console.log("第n个节点确认",res);});}[xss_clean]
网页上写个发送按钮,成功转账
{{address}} {{mount}}transfer account
你可能感兴趣的文章
-
【推荐】【谈·ETH矿工收益组成部分
-
【推荐】【谈·ETH矿工收益组成部分
2021年一场挖矿潮强势来袭。让很多朋友参与了挖矿的这波潮流之上。关注过咱们的朋友们,经过一序列的学习之后。大致对挖矿有一定的了解。但是真正的挖矿。那么我们矿工...
2024-11-15
推荐简述以太坊智能钱包发展历程及主流产品
-
推荐简述以太坊智能钱包发展历程及主流产品
从功能、安全性、手续费抽象等角度简单了解 MYKEY、Argent 等智能钱包有何异同。智能钱包是密码学货币通往主流人群的一种途径。智能钱包以智能合约作为账户与...
2024-11-15
虚拟币钱包申请流程是什么?新手需要准备哪些资料?
-
虚拟币钱包申请流程是什么?新手需要准备哪些资料?
四、注意事项 在申请虚拟币钱包时,新手需要注意以下几点: 确保从官方渠道下载和安装钱包应用,避免安装恶意软件或遭受钓鱼攻击
2024-11-15
推荐私钥丢失怎么办Polkawallet
-
推荐私钥丢失怎么办Polkawallet
*twitter.com6月10日,Polkadot 联合创始人、Web3 基金会主席 Gavin Wood 博士转发 Polkawallet 官方推特并称 P...
2024-11-15
WEB3币
-
WEB3币
中文名称 WEB3 ...
2024-11-14
【推荐】密码学在 Web3 钱包中的应用:私钥是什么?bitget钱包为例
-
【推荐】密码学在 Web3 钱包中的应用:私钥是什么?bitget钱包为例
在非对称加密演算法中,私钥是一串随机生成的数字,通常以十六进制数表示(也就是由0、1、2、3、4、5、6、7、8、9、a、b、c、d、e和f组成)。私钥生成后,...
2024-11-14
【推荐】Eth2验证者如何生成和保护取款密钥Ajian
-
【推荐】Eth2验证者如何生成和保护取款密钥Ajian
取款密钥是什么?取款密钥(withdrawal key)是以太坊 2.0 中的验证者用来提现以太币的密钥 1。以太坊 2.0 的密钥与以太坊 1.0 的密钥在生...
2024-11-14
SevenX Ventures: 一文读懂账户抽象,ERC4337如何带来以太坊账户的进化?
-
SevenX Ventures: 一文读懂账户抽象,ERC4337如何带来以太坊账户的进化?
正如许多人所说,账户抽象 (AA) 技术,尤其是 ERC-4337 ,有望彻底改变自我托管钱包的用户体验,并使其能够扩展以供大规模采用。然而, 2023 年 5...
2024-11-14
WEB3币
-
WEB3币
中文名称 WEB3 ...
2024-11-14
GAS币
-
GAS币
中文名称 GAS 币...
2024-11-13