区块链编译和部署(测试链网络)
1.这里推荐以太坊的holesky测试网和polygon的amoy测试网
下面就以以太坊的holesky为例
1.安装必备插件
-
在浏览器(尽量使用谷歌浏览器)的扩展程序中搜索MetaMask(钱包),并注册账户,你会有一个钱包地址和助记词(私钥)
-
truffle下载
npm install -g truffle
truffle version
2.在MetaMask中添加测试网络
左上角选择网络,点添加网络或者自定义网络
按照以下进行填写
//网络名称:Holesky Test Network //这个可以自己定义
//新的 RPC URL:https://rpc.holesky.ethpandaops.io/
//链 ID : 17000
//区块浏览器 URL:https://holesky.etherscan.io/
添加完之后保存即可,切换到刚刚添加的网络
https://cloud.google.com/application/web3/faucet/ethereum/holesky
进入上面的网站领取测试币,每天可以领取一次,不过没必要
3.找一个合适的区块链平台
1.推荐使用alchemy,infura,chainstack和QuickNode
登录之后在平台中创建自己的项目
选择自己的网络,网址后面是自己的密钥,直接复制即可
https://eth-holesky.g.alchemy.com/v2/your_API密钥
2.然后在truffle项目中进行配置
- 需要先在truffle项目的目录下下载hdwallet-provider包
npm init -y
npm install @truffle/hdwallet-provider
- 配置truffle-config.js
// truffle-config.js
const HDWalletProvider = require('@truffle/hdwallet-provider');
const mnemonic = "这里填写钱包的助记词";
module.exports = {
networks: {
holesky: {
provider: () => new HDWalletProvider(
mnemonic,
`https://eth-holesky.g.alchemy.com/v2/your_API密钥`
),
network_id: "*", // holesky的链Id是17000,设置*表示适配所有的链
confirmations: 2,
timeoutBlocks: 200,
skipDryRun: true,
timeoutBlocks: 200, // 等待区块确认的超时时间
networkCheckTimeout: 1000000000, // 网络检查的超时时间
}
},
compilers: {
solc: {
version: "0.8.20"
}
}
};
-
智能合约(举例)
/contracts 这个是存智能合约的目录
合约的命名以.sol结尾即可,前面可根据自身情况来定义,迁移文件只认编译生成的文件名
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // MintToken 就是编译后生成的json文件的文件名 contract MintToken is ERC20 { address public minter; event MinterChanged(address indexed from, address to); constructor() ERC20("AToken", "ATK") { minter = msg.sender; } function mintTokens(address to, uint256 amount) external { require(msg.sender == minter, "Only minter can mint tokens"); _mint(to, amount); } function changeMinter(address newMinter) external { require(msg.sender == minter, "Only current minter can change minter"); emit MinterChanged(minter, newMinter); minter = newMinter; } }
-
编辑迁移文件
迁移文件在 /migrations 中创建,命名规则是必须以数字开头,我这里命名为2_deploy_mint.js
//2_deploy_mint.js const MintToken = artifacts.require("MintToken"); // 上面的这个MintToken是编译后生成的文件名,也是上一步智能合约中contract MintToken is ERC20中的 MintToken,需要把下面的也改成这个 module.exports = async function (deployer) { // 设置重试次数和延迟时间 const maxRetries = 5; const delay = 15000; // 部署 BToken 合约 for (let attempt = 1; attempt <= maxRetries; attempt++) { try { console.log(`Attempt ${ attempt} to deploy MintToken`); await deployer.deploy(MintToken); //这个必须要跟上面一致 console.log(`Successfully deployed MintToken on attempt ${ attempt}`); break; // 如果部署成功,跳出循环 } catch (error) { console.error(`Attempt ${ attempt} failed: ${ error.message}`); if (attempt < maxRetries) { console.log(`Waiting for ${ delay / 1000} seconds before retrying...`); await new Promise(resolve => setTimeout(resolve, delay)); } else { console.error('Max retries reached. Deployment failed.'); throw error; // 达到最大重试次数后抛出错误 } } } };
完成上面的操作后,在truffle项目目录下的命令行中输入
truffle compile //编译生成build目录和json文件
truffle migrate --network holesky // 编译并部署到区块链网络上
出现contract address才算成功
4.在代码中具体实现(以go为例)
生成的json文件中会有一个abi文件,在/build中找到与自己合约同名的json文件
复制到自己的代码项目库中
// 读取合约ABI
abiData, err := ioutil.ReadFile("utils/solidity/MintToken.abi")
if err != nil {
return fmt.Errorf("failed to read ABI file: %w", err)
}
// 解析ABI
parsedABI, err := abi.JSON(bytes.NewReader(abiData))
if err != nil {
return fmt.Errorf("failed to parse ABI: %w", err)
}
通过上面的命令解析abi中的函数,后续可以直接调用函数