使用 Truffle 和 Ganache 搭建本地以太坊开发环境并部署一个简单智能合约
使用 Truffle 和 Ganache 搭建本地以太坊开发环境并部署一个简单智能合约的详细步骤:
一、环境搭建
-
安装 Node.js 和 npm
-
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,npm 是 Node.js 的包管理器。可以从 Node.js 官方网站下载安装程序,建议选择 LTS(Long-Term Support)版本。
-
安装完成后,在命令行中运行以下命令验证安装是否成功
node -v npm -v
-
-
安装 Truffle
-
Truffle 是一个用于以太坊开发的框架,提供了一套工具和库,帮助开发者更轻松地开发、测试和部署智能合约。在命令行中运行以下命令安装 Truffle
npm install -g truffle
-
-
安装 Ganache
-
Ganache 是一个用于本地开发和测试以太坊应用程序的个人区块链,提供了一个模拟的以太坊网络环境。可以从 Ganache 官网下载安装文件。
-
安装完成后,启动 Ganache,它会默认在本地创建一个开发用的区块链网络,通常监听
http://127.0.0.1:7545
。
-
二、创建项目并编写智能合约
-
创建项目目录并初始化
-
创建一个新的项目目录,并初始化 Truffle 项目
mkdir mydapp cd mydapp truffle init
-
这将生成项目模板文件,包括
contracts
、migrations
和test
目录,以及truffle-config.js
配置文件。
-
-
编写智能合约
-
在
soliditycontracts
目录下创建一个新的 Solidity 智能合约文件,例如SimpleStorage.sol
,并编写以下代码:// SPDX-License-Identifier: MIT pragma solidity ^0.8.0;contract SimpleStorage {uint public storedData;function set(uint x) public {storedData = x;}function get() public view returns (uint) {return storedData;} }
-
这个合约包含一个
set
函数用于存储数据,一个get
函数用于获取存储的数据。
-
三、配置 Truffle 并部署智能合约
-
更新 Truffle 配置文件
-
打开
JavaScripttruffle-config.js
文件,修改网络配置以连接到 Ganache:module.exports = {networks: {development: {host: "127.0.0.1",port: 7545,network_id: "*" // Match any network id}},solc: {optimizer: {enabled: true,runs: 200}} };
-
确保
host
、port
和network_id
与 Ganache 的配置一致。
-
-
创建迁移脚本
-
在
JavaScriptmigrations
目录中创建文件2_deploy_contracts.js
,内容如下:var SimpleStorage = artifacts.require("./SimpleStorage.sol");module.exports = function(deployer) {deployer.deploy(SimpleStorage); };
-
这个脚本告诉 Truffle 如何部署
SimpleStorage
合约。
-
-
编译和部署智能合约
-
在项目根目录下运行以下命令编译智能合约
truffle compile
-
编译成功后,运行以下命令部署智能合约到 Ganache
truffle migrate
-
如果一切正常,你将看到合约部署成功的消息,包括合约地址。
-
四、与智能合约交互
-
使用 Truffle 控制台与合约交互
-
启动 Truffle 控制台
truffle console
-
获取合约实例:
SimpleStorage.deployed().then(function(instance) { app = instance; });
-
获取账户列表:
web3.eth.getAccounts().then(accounts => {console.log(accounts); });
-
设置存储值:
web3.eth.getAccounts().then(accounts => {app.set(42, { from: accounts[0] }); });
-
获取存储值:
app.get().then(function(value) { console.log(value.toString()); });
-
这将设置存储值为 42,并获取存储的值。
-
-
使用 Web3.js 与合约交互
-
创建一个名为
JavaScriptinteract.js
的文件,并用以下代码填充它:const { Web3 } = require('web3'); const fs = require('fs'); const path = require('path');const web3 = new Web3('http://127.0.0.1:7545');// 加载合约的 ABI 和字节码 const contractData = require('./build/contracts/SimpleStorage.json'); const abi = contractData.abi; const bytecode = contractData.bytecode;// 创建合约实例 const myContract = new web3.eth.Contract(abi);async function interact() {try {// 获取账户列表const accounts = await web3.eth.getAccounts();console.log('Accounts:', accounts);// 部署合约const contract = await myContract.deploy({ data: bytecode }).send({ from: accounts[0], gas: 1000000 });console.log('Contract deployed at address:', contract.options.address);// 调用合约方法await contract.methods.set(42).send({ from: accounts[0] });const value = await contract.methods.get().call();console.log('Stored value:', value);} catch (error) {console.error('Error:', error);} }interact();
-
运行以下命令与合约交互
node interact.js
-
通过以上步骤,你就可以使用 Truffle 和 Ganache 搭建本地以太坊开发环境,并部署和交互一个简单的智能合约。