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