首先,确保你已经安装了 Node.js。你可以在官网下载,安装过程很简单,跟着提示走就行。安装完后,可以在终端(命令行)里输入以下命令检查一下版本:
node -v
看到版本号就代表成功了。接着,咱还需要一个包管理工具,Node.js 默认有 npm,你也可以安装 yarn,都是很常用的工具。
接下来,找个地方新建一个文件夹来放咱的项目,命名随你喜欢,比如叫“my-wallet”。然后进入这个文件夹,执行以下命令来初始化一个新项目:
npm init -y
这样就会生成一个 package.json 文件,里面包含了项目的基本信息。
搭建钱包的过程中,咱需要一些依赖来帮助实现功能。比如,常用的库就是 express(用来搭建服务器),mongoose(如果需要数据库的话),crypto(用来加密操作),当然还会用到一些与区块链交互的库,比如 web3.js 或者 ethers.js。
npm install express mongoose crypto web3
这些库用起来都比较简单,文档也很全,没啥太大问题。
接着,咱们先搭个最简单的服务器来确认一切都正常。在项目根目录下新建一个 server.js 文件,写上以下代码:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello, Wallet!');
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
然后在命令行中输入:
node server.js
打开浏览器访问 http://localhost:3000,如果看到 “Hello, Wallet!” 的话,恭喜你,服务器搭建成功!
现在说说如何实现钱包的创建和管理。钱包其实就是一对私钥和公钥的组合,钱包的本质就是这两个东西。这里咱们可以用 crypto 模块来生成密钥对:
const crypto = require('crypto');
function createWallet() {
const wallet = {};
const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'secp256k1' // 以太坊使用的曲线
});
wallet.privateKey = privateKey.export({ format: 'pem', type: 'pkcs8' }).toString();
wallet.publicKey = publicKey.export({ format: 'pem', type: 'spki' }).toString();
return wallet;
}
const myWallet = createWallet();
console.log('私钥:', myWallet.privateKey);
console.log('公钥:', myWallet.publicKey);
执行这段代码后,会生成一个钱包的私钥和公钥。记得,私钥一定要妥善保存!别丢了哈。
接下来,我们要从公钥生成一个地址。一般来说,钱包地址是根据公钥经过一系列 hashing 算法计算得来的,这里可以用到 keccak256 哈希函数。
const { keccak256 } = require('js-sha3');
function getWalletAddress(publicKey) {
const hash = keccak256(publicKey);
return '0x' hash.slice(-40); // 取后40位
}
const address = getWalletAddress(myWallet.publicKey);
console.log('钱包地址:', address);
这样就给钱包生成了一个地址,像 “0x12345...67890” 这种形式,看着就很酷炫吧?
钱包不能单靠自己呀,我们需要和区块链交互才行。以以太坊为例,可以使用 web3.js 库来实现。安装完库后,咱可以创建一个与以太坊节点的连接:
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'); // 记得替换你的项目 ID
这一步其实是你与区块链建立联系的入口,通过这个连接,你可以查询区块链上的信息,比如余额、交易记录等等。
通过 web3.js 获取钱包的余额是很简单的,咱可以新加个 API 接口来查询余额:
app.get('/balance/:address', async (req, res) => {
const address = req.params.address;
const balance = await web3.eth.getBalance(address);
res.send({ address: address, balance: web3.utils.fromWei(balance, 'ether') ' ETH' });
});
这样访问 /balance/YOUR_WALLET_ADDRESS 就能获取到你的余额信息,记得把钱包地址替换成你生成的那个。
当然了,有收入就得有支出,咱们的这个钱包自然也得支持发送交易。可是,发交易可不能随便来,得签名,这样才能确保安全。我们可以这样实现:
app.post('/send', async (req, res) => {
const { to, amount } = req.body; // 从请求体中获取参数
const account = web3.eth.accounts.privateKeyToAccount(myWallet.privateKey);
const tx = {
from: account.address,
to: to,
value: web3.utils.toWei(amount, 'ether'),
gas: 2000000
};
const signedTx = await web3.eth.accounts.signTransaction(tx, myWallet.privateKey);
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
res.send(receipt);
});
这样就简单实现了发送 ETH 的功能,不过,发送前一定要确认一下余额足够哦!
至此,你已经搭建了一个基础的数字钱包,能生成钱包、查询余额、发送交易等功能。虽然这个例子比较简单,但实际应用中需要考虑的安全问题、用户体验等因素更多。如果要上线,记得要做好安全加固,不然可就麻烦了。
可以继续深入研究如何实现交易记录查询、钱包助记词等功能,慢慢把这个项目做得更完善。希望你能通过这个项目,深入理解区块链的基本概念,加油哦!
以上就是搭建一个简单钱包的过程。希望对你有帮助,如果有任何问题,随时聊啊!