如何编写脚本实现Solidity合约自动化部署及前置操作(适配Remix)
解决方案:合约自动化部署+前置操作脚本(适配Remix+Ganache)
一、用Remix内置脚本搞定自动化部署+前置步骤
Remix自带JS脚本支持,直接写个脚本就能一键完成部署+新增航司/航班这些前置操作,不用每次手动重复操作:
- 在Remix文件管理器里新建
deploy-script.js,把下面的代码贴进去(记得替换成你自己的合约名和函数名):
async function main() { // 拿到合约编译后的ABI和字节码(Remix自动处理编译流程) const artifact = await remix.call('compiler:getArtifact', 'FlightBooking.sol'); const contractName = 'FlightBooking'; // 连接Ganache节点,用第一个账户作为部署者 const provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545'); const signer = (await ethers.getSigners())[0]; // 部署合约 const factory = new ethers.ContractFactory(artifact.abi, artifact.bytecode, signer); const contract = await factory.deploy(); await contract.deployed(); console.log(`合约部署完成,地址:${contract.address}`); // 自动执行前置操作:新增航空公司和航班 await contract.addAirline('AirChina', 'CA'); console.log('已自动新增航空公司 AirChina'); await contract.addFlight('CA123', 'BEIJING', 'SHANGHAI', 100, ethers.utils.parseEther('0.005')); console.log('已自动新增航班 CA123'); } main().catch(err => console.error('脚本执行出错:', err));
- 切换到Remix的「Scripts」面板,选中这个脚本点击「Run」,执行完成后直接去「Deployed Contracts」里找到你的合约,就能直接测试购票函数了。
二、解决Truffle部署后Remix找不到合约的问题
Truffle部署的合约地址存在build/contracts下的JSON文件里,Remix不会自动识别,手动导入即可:
- 部署完成后,找到
build/contracts/FlightBooking.json - 在Remix里点击「Import」,选择这个JSON文件
- 然后在「Deploy & Run Transactions」面板点击「At Address」,输入Truffle返回的合约地址,就能加载已部署的合约继续测试。
嫌Truffle麻烦的话,换Hardhat更省心,和Remix兼容性更好:
- 初始化Hardhat项目:
npx hardhat init - 编写部署脚本
scripts/deploy.js:
const { ethers } = require("hardhat"); async function main() { const FlightBooking = await ethers.getContractFactory("FlightBooking"); const contract = await FlightBooking.deploy(); await contract.deployed(); console.log(`合约地址:${contract.address}`); // 自动执行前置步骤 await contract.addAirline('AirChina', 'CA'); await contract.addFlight('CA123', 'BEIJING', 'SHANGHAI', 100, ethers.utils.parseEther('0.005')); } main().catch(error => { console.error(error); process.exitCode = 1; });
- 在
hardhat.config.js里配置localhost网络:
module.exports = { solidity: "0.8.19", networks: { localhost: { url: "http://127.0.0.1:8545" } } };
- 部署到Ganache:
npx hardhat run scripts/deploy.js --network localhost - 回到Remix,要么直接输入合约地址点击「At Address」,要么导入Hardhat生成的
artifacts/contracts/FlightBooking.sol/FlightBooking.json,就能加载合约继续测试。
三、另一种思路:用Remix测试套件批量执行
不想写脚本的话,用Remix的测试功能也行,把前置步骤放到beforeEach钩子中,每次跑测试自动完成部署+前置操作:
const { expect } = require("chai"); describe("FlightBooking", function () { let contract; beforeEach(async function () { // 部署合约 const FlightBooking = await ethers.getContractFactory("FlightBooking"); contract = await FlightBooking.deploy(); await contract.deployed(); // 自动执行前置操作 await contract.addAirline('AirChina', 'CA'); await contract.addFlight('CA123', 'BEIJING', 'SHANGHAI', 100, ethers.utils.parseEther('0.005')); }); it("测试购票功能", async function () { const signer = (await ethers.getSigners())[0]; await contract.bookFlight('CA123', { value: ethers.utils.parseEther('0.005') }); const ticketCount = await contract.getTicketCount(signer.address); expect(ticketCount).to.equal(1); }); });
在Remix的「Testing」面板运行这个测试用例,改完合约后直接跑测试,全流程自动完成。
内容的提问来源于stack exchange,提问作者Kural Manivannan
相关产品推荐
相关产品推荐

