00 前言
上一篇文章写的是geth私有链搭建。这篇文章本来想继续用geth,结合VS code 的solidity插件优雅地部署私有链合约。无奈VS code solidity插件编译好的abi JSON文件在geth中赋值的时候一直有问题,并且用JSON验证工具验证该文件显示没有问题。因此改用了truffle工具,现将过程介绍如下。
01 安装truffle
Truffle suite 在官网上https://www.trufflesuite.com/或者https://truffleframework.org/docs/getting_started/testing上有相关的介绍。使用命令npm install -g truffle进行安装。由于默认的镜像源是国外的,所以我们要换源。使用 npm config set registry http://registry.npm.taobao.org换成淘宝源。安装node.js不做具体介绍了。
02 安装solc
因为solc只是一个程序集,如果我们想要在终端中使用solc程序编译智能合约,则需要安装solc-cli,这是solc的命令行界面。使用命令sudo npm install -g solc solc-cli --save-dev安装。输入solcjs --help命令查看是否成功。
03 安装testrpc(和Ganache二选一)
testrpc不同于geth,geth是真正的以太坊环境,testrpc是在本地使用内存模拟的一个以太坊环境,对于开发调试来说,更为方便快捷。使用命令 npm install -g ethereumjs-testrpc安装,然后输入命令testrpc测试是否安装成功。
想要关闭的话用ctrl + c 即可。
04 初始化truffle 04-1 创建项目
新建一个项目truffleProject文件夹:C:software\truffleProject,在文件夹中打开cmd在目录truffleProject下执行trffle init命令:
04-2 目录结构说明
@contracts目录中包含Solidity合约代码,其中Migrations.sol是必须的,其他就是你自己写的合约代码了。
@migrations目录中包含合约部署脚本,其中1_initial_migration.js就是用来部署Migrations.sol的,其他的脚本会按照顺序依次执行。
@test目录中就是测试代码了。
@truffle-config.js是配置文件。
05 编写合约
在contracts目录下编写合约,然后在migration目录下仿照编写对应的2.xxx.xxx.js,3.xxx.xxx.js以此类推。例如编写Test.sol内容如下:
pragma solidity >&#61;0.4.0 <0.7.0;contract Test {function sayHello() public pure returns (string memory) {return "Hello World";}
}
编写2_initial_test.js内容如下&#xff1a;
var Test &#61; artifacts.require("Test.sol");module.exports &#61; function(deployer){deployer.deploy(Test);
}
06 上传合约
06-1 在当前文件夹使用truffle compile编译合约
06-2 打开truffle控制台truffle develop
这一步可以省略&#xff0c;也可以第一步直接打开。好处在于不用重复输入truffle&#xff0c;并且可以使用truffle控制台命令。另外上传的过程中最好打开一个新的终端运行testrpc。
06-3 部署合约
使用命令truffle(develop)> migrate进行部署&#xff0c;如果是第二次部署&#xff0c;则用&#xff1a;truffle(develop)> migrate --reset。
06-4 调用合约
使用命令Let contract&#xff0c;然后用 contract &#61; Test.deployed().then(instance &#61;> contract &#61; instance)
06-5 测试
使用命令contract.sayhello()进行测试&#xff0c;结果输出如下&#xff1a;
如果test.sol文件中sayHello()函数不限定为pure的话&#xff0c;则会返回交易信息&#xff1a;
07 Geth 相关
07-1 Geth遇到的问题
使用geth部署合约的时候有abi错误&#xff0c;没有解决&#xff0c;并且ganache-Windows版的下载不下来。于是最后改用了testrpc:
07-2 Geth构建不同主机的节点(使用testrpc测试的话不需要)
1. 启动一个节点之后&#xff0c;通过admin.nodeInfo.enode查看这个节点的enode。其他节点启动的时候&#xff0c;添加--bootnodes参数&#xff0c;以及端口号&#xff0c;通过--port来设置。例如&#xff1a;
geth --datadir&#61;./ --bootnodes&#61;enode://bafe93edee0c5cfab6a3d12927553abe6f9a3cf31b56b58d65c05e52edf184dcf88f8a2a3d84f3911bc2233c0140188e1e8717c26ff98a0268298c3a933c1855&#64;127.0.0.1:30303 --port&#61;31303 console
如果已经启动了的话&#xff0c;可以通过&#xff1a;admin.addPeer("enode://.........&#64;ip:port")添加节点。
2. 开放rpc的方法&#xff1a;geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --datadir /root/chain --port 30303 --networkid 100000 console添加其他主机改变IP地址即可。开放rpc的目的是能够让节点连接
3. 查看节点信息&#xff1a;admin.nodeInfo admin.peers
查看节点数&#xff1a;net.peerCount
添加节点&#xff1a;admin.addPeer("enode://.........&#64;ip:port")