如何在Node.js中生成EOS地址及完成交易?附公私钥生成代码
生成EOS地址与交易操作指南
和BTC、ETH直接用公钥哈希作为交易地址不同,EOS的交易体系是基于账户名+密钥对的——你代码里生成的EOSxxxx格式字符串是EOS的公钥(用于交易签名),而实际接收资产需要一个12位的EOS账户名。下面我一步步给你拆解生成逻辑、账户创建和交易操作:
一、生成EOS密钥对(优化你的现有代码)
你的代码已经用BIP39+BIP44路径实现了EOS密钥对生成,这里给你优化细节并解释关键逻辑:
- 助记词转种子:
bip39.mnemonicToSeed直接返回Buffer,无需转字符串再转回,避免编码错误 - HD路径选择:EOS的标准BIP44路径是
m/44'/194'/0'/0'/索引(带撇号的hardened推导更安全),你原代码用的非hardened路径也兼容,但推荐用标准写法 - 密钥格式化:
eosjs-ecc会自动把HD节点的公钥转换成EOS专属的EOSxxxx格式,私钥则用WIF编码适配EOS网络
优化后的代码:
const hdkey = require('hdkey') const wif = require('wif') const ecc = require('eosjs-ecc') const bip39 = require('bip39') // 你的助记词 const mnemonic = 'butter decrease' // 直接使用生成的Buffer种子 const seed = bip39.mnemonicToSeed(mnemonic) // 生成HD主节点 const master = hdkey.fromMasterSeed(seed) // EOS标准BIP44路径,最后一位索引可修改生成多组密钥对 const node = master.derive("m/44'/194'/0'/0'/13") // 生成EOS格式公钥 const eosPublicKey = ecc.PublicKey(node._publicKey).toString() // 生成EOS兼容的WIF私钥 const eosPrivateKey = wif.encode(128, node._privateKey, false) console.log("EOS公钥: " + eosPublicKey) console.log("EOS私钥: " + eosPrivateKey)
注:你原代码里的
chainCode是HD钱包推导的辅助参数,日常交易和密钥管理不需要单独编码使用,可忽略。
二、创建可交易的EOS账户
有了公钥还不能直接交易,你需要注册一个12位的EOS账户名(仅支持.12345abcdefghijklmnopqrstuvwxyz字符)。创建账户需要:
- 一个已存在的EOS账户(用来支付创建所需的RAM、CPU/NET资源费用)
- 你生成的EOS公钥(作为账户的
owner和active权限密钥,可共用同一个)
用EOS官方工具cleos创建账户的命令示例:
cleos system newaccount --stake-net '0.1 EOS' --stake-cpu '0.1 EOS' --buy-ram-kbytes 8 已有账户名 你的新账户名 EOS5KvrNrXQM96jWaQmJW6QYCU28Q6p7QktcQzSCrKHe68bxXxk4R EOS5KvrNrXQM96jWaQmJW6QYCU28Q6p7QktcQzSCrKHe68bxXxk4R
参数说明:
--stake-net/--stake-cpu:抵押EOS获取网络和计算资源--buy-ram-kbytes:购买账户所需的内存空间- 末尾两个公钥分别对应账户的
owner(最高权限)和active(日常操作权限)
三、发起EOS转账交易
有了账户和私钥后,用eosjs库可以快速实现代码级交易:
1. 安装依赖
npm install eosjs node-fetch
2. 转账代码示例
const { Api, JsonRpc, RpcError } = require('eosjs'); const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig'); const fetch = require('node-fetch'); const { TextEncoder, TextDecoder } = require('util'); // 填入你的EOS私钥 const privateKeys = ['5JBNSUbD4anpFFe3CbURTBtbpbUGLGtVUatDd1uL1i1HbjZjqGd']; const signatureProvider = new JsSignatureProvider(privateKeys); // 连接EOS测试网(主网可替换为https://eos.greymass.com) const rpc = new JsonRpc('https://jungle4.cryptolions.io:443', { fetch }); const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); // 发起转账 async function transferEOS() { try { const result = await api.transact({ actions: [{ account: 'eosio.token', // EOS代币合约账户 name: 'transfer', // 转账动作 authorization: [{ actor: '你的新账户名', // 发起转账的账户 permission: 'active', // 使用active权限 }], data: { from: '你的新账户名', to: '接收方账户名', quantity: '0.0001 EOS', // 转账数量必须带4位小数 memo: '测试转账', // 转账备注(可选) }, }] }, { blocksBehind: 3, // 基于最近3个区块确认交易 expireSeconds: 30, // 交易30秒内有效 }); console.log('交易成功,哈希:', result.transaction_id); } catch (e) { console.error('交易失败:', e instanceof RpcError ? e.json : e); } } transferEOS();
交易关键注意事项
- 资源要求:EOS交易需要消耗CPU和NET资源,这些资源来自账户抵押的EOS,资源不足时需先抵押获取
- 网络区分:测试网和主网的节点地址不同,测试网可免费获取测试EOS用于调试
- 格式规范:转账数量必须严格遵循
X.XXXX EOS格式,保留4位小数
内容的提问来源于stack exchange,提问作者Deepak Garg
相关产品推荐
相关产品推荐

