智能合约模糊测试编译部署脚本
0. 脚本仓库
https://github.com/peakcrosser7/Contracts-Compile-And-Deploy
1.依赖安装
1.1 升级npm
使用命令
sudo npm -g install npm@next
1.2 升级node.js
- 下载用于管理node.js版本的"n"模块, 使用命令:
sudo npm install -g n
- 安装node.js稳定版, 使用命令:
n stable
2.使用Truffle
2.1 安装Truffle
使用命令:
sudo npm install -g truffle
2.2 创建工程
- 创建工程目录并进入, 使用命令:
mkdir trufflePro
cd trufflePro
- 初始化工程, 在工程目录使用命令:
truffle
truffle init
初始化成功后终端如图:
项目目录中结构如图:
contract/
- Truffle默认的合约文件存放地址migrations/
- 存放发布脚本文件test/
- 用来测试应用和合约的测试文件truffle-config.js
- Truffle的配置文件
2.3 编译合约
(1) 设置solc版本
版本信息位于文件./truffle-config.js
中, 如图:
默认全部注释, 表示默认配置, 关闭version
注释, 即可设置具体编译器版本.
(2) 编译合约
合约应位于./contracts
目录, 编译合约使用命令:
truffle compile
编译成功后即可在./build/contracts/
目录下找到合约编译后对应json文件, 文件中具有合约的abi、字节码等信息.
2.4 部署合约
(1) 配置部署文件
部署合约文件位于目录./migrations
, 创建配置文件, 以数字开头, 如2_xxx.js
, 文件内容为:
var Test = artifacts.require("contract.sol");
//"contract.sol"替换成具体的合约文件名
module.exports = function(deployer) {deployer.deploy(Test);
};
(2) 修改Truffle配置
修改./truffle-config.js
文件networks
部分, 如图:
其中, development
为以太网(私有链)网络名, 可自定义; host
和port
的值一般按此默认值, network_id
可固定值也可以使用通配符*
, gas
值为交易时默认gas值.
(3) 以太坊配置
- 打开一个终端, 启动本地私有链, 使用命令:
geth --rpc --rpcport "8545" --rpccorsdomain "*" --datadir node0 --port "30303" --networkid 506 console --unlock 0 --password "./pwd.txt"
其中: rpcport
、·networkid
值要与上述truffle-config.js
文件中一致; datadir
的值根据自身私有链设置; console
表明控制台交互模式; unlock
值对应解锁的账户序号, 需要设为默认账户即0
; password
值问账户密码所在文件的路径.
2. 私有链启动挖矿, 使用命令: miner.start()
(4) 部署合约
在Truffle项目根目录启动另一终端, 使用命令部署合约:
truffle migrate --network development
#参数network后跟网络名, 须与truffle-config.js中一致, 可省
若成功部署则会显示部署后的相关信息, 如图:
遇到问题及处理:
- Something went wrong while attempting to connect to the network
解决: 确保以太坊私有链网络率先启动且启动时需要有参数--rpc
- Error: Could not find artifacts for Migrations from any sources
解决: 确保./migrations
目录下配置文件中部署的合约文件名"xxx.sol"正确. - Returned error: authentication needed: password or unlock.
解决: 未在私有链设置解锁账户, 应使用上述启动私有链命令启动时解锁账户, 或者在私有链终端使用personal.unlockAccount(account, passwd)
命令进行账户解锁. (经测试, 最好解锁默认0号账户) - could not deploy due to insufficient funds
解决: 确保解锁账户有余额, 可以先使用该账户挖矿获得足够以太币后再部署.(私有链命令操作详见#03.3.3(2)) - ran out of gas (using a value you set in your network config or deployment parameters.)
解决: 部署合约的gas用尽, 在./truffle-config.js
文件中gas
的值要足够大. - exceeded the block limit (with a gas value you set).
解决: 部署合约发送的gas值超出了区块限制, 区块的gas限制值可在私有链的gensis.json
文件(名字类似, 为生成私有链的配置文件)中查到, 如图:
要修改./truffle-config.js
文件中gas
的值不超过该gaslimit
的值; 同时也可以设置genesis.json
中的gasLimit
的值更大一些(目前已知可行的修改方法是在初始化私有链的创世块前对该文件的gasLimit
值进行修改, 私有链部署相关操作详见#03.3.2). - Transaction was not mined within 750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined!.
解决: 未及时完成合约部署, 确保私有链已经开始挖矿, 原因不详, 再次使用命令部署时成功. - The contract code couldn’t be stored, please check your gas limit.
解决: ./truffle-config.js
文件中gas
的值要足够大. - Number can only safely store up to 53 bits
解决: 原因不详, 猜测可能为上述私有链gensis.json
文件中gasLimit
值大小超过53bits, 上图的0x800000000
暂无此问题.
3. 使用脚本
- 根据上述 #1, #2.1, #2.2 安装Truffle并构建一个项目目录
- 删除创建的Truffle项目目录下除
truffle-config.js
以外的文件夹和文件 - 按照 #2.4(2) 设置Truffle连接的私有链
- 打开用于部署合约的私有链, 解锁账户后进行挖矿
- 根据运行环境修改脚本
contrCompDeploy.py
中的路径等参数 - 运行脚本
contrCompDeploy.py