智能合约模糊测试编译部署脚本

智能合约模糊测试编译部署脚本

0. 脚本仓库

https://github.com/peakcrosser7/Contracts-Compile-And-Deploy

1.依赖安装

1.1 升级npm

使用命令

sudo npm -g install npm@next

1.2 升级node.js

  1. 下载用于管理node.js版本的"n"模块, 使用命令:
sudo npm install -g n
  1. 安装node.js稳定版, 使用命令:
n stable
  • 注: 更新完成后需要重新启动终端

2.使用Truffle

2.1 安装Truffle

使用命令:

sudo npm install -g truffle

2.2 创建工程

  1. 创建工程目录并进入, 使用命令:
mkdir trufflePro    # trufflePro工程目录名
cd trufflePro
  1. 初始化工程, 在工程目录使用命令:
truffle
truffle init
  • 遇到问题: RequestError: Error: connect ECONNREFUSED 127.0.0.1:443
    解决: 更改hosts文件
    1. 打开hosts文件: sudo vi /etc/hosts
    2. 添加以下内容:
    0.0.0.0:443 github.com
    199.232.68.133  raw.githubusercontent.com
    
    参考: 在ubuntu执行truffle init出现错误

初始化成功后终端如图:
智能合约模糊测试编译部署脚本_第1张图片
项目目录中结构如图:
智能合约模糊测试编译部署脚本_第2张图片

  • contract/ - Truffle默认的合约文件存放地址
  • migrations/ - 存放发布脚本文件
  • test/ - 用来测试应用和合约的测试文件
  • truffle-config.js - Truffle的配置文件

2.3 编译合约

(1) 设置solc版本

版本信息位于文件./truffle-config.js中, 如图:
智能合约模糊测试编译部署脚本_第3张图片
默认全部注释, 表示默认配置, 关闭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部分, 如图:
智能合约模糊测试编译部署脚本_第4张图片
其中, development为以太网(私有链)网络名, 可自定义; hostport的值一般按此默认值, network_id可固定值也可以使用通配符*, gas值为交易时默认gas值.

(3) 以太坊配置

  1. 打开一个终端, 启动本地私有链, 使用命令:
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中一致, 可省

若成功部署则会显示部署后的相关信息, 如图:
智能合约模糊测试编译部署脚本_第5张图片

遇到问题及处理:

  1. Something went wrong while attempting to connect to the network
    智能合约模糊测试编译部署脚本_第6张图片
    解决: 确保以太坊私有链网络率先启动且启动时需要有参数--rpc
  2. Error: Could not find artifacts for Migrations from any sources
    智能合约模糊测试编译部署脚本_第7张图片
    解决: 确保./migrations目录下配置文件中部署的合约文件名"xxx.sol"正确.
  3. Returned error: authentication needed: password or unlock.
    智能合约模糊测试编译部署脚本_第8张图片
    解决: 未在私有链设置解锁账户, 应使用上述启动私有链命令启动时解锁账户, 或者在私有链终端使用personal.unlockAccount(account, passwd)命令进行账户解锁. (经测试, 最好解锁默认0号账户)
  4. could not deploy due to insufficient funds
    智能合约模糊测试编译部署脚本_第9张图片
    解决: 确保解锁账户有余额, 可以先使用该账户挖矿获得足够以太币后再部署.(私有链命令操作详见#03.3.3(2))
  5. ran out of gas (using a value you set in your network config or deployment parameters.)
    智能合约模糊测试编译部署脚本_第10张图片
    解决: 部署合约的gas用尽, 在./truffle-config.js文件中gas的值要足够大.
  6. exceeded the block limit (with a gas value you set).
    智能合约模糊测试编译部署脚本_第11张图片
    解决: 部署合约发送的gas值超出了区块限制, 区块的gas限制值可在私有链的gensis.json文件(名字类似, 为生成私有链的配置文件)中查到, 如图:
    智能合约模糊测试编译部署脚本_第12张图片
    要修改./truffle-config.js文件中gas的值不超过该gaslimit的值; 同时也可以设置genesis.json中的gasLimit的值更大一些(目前已知可行的修改方法是在初始化私有链的创世块前对该文件的gasLimit值进行修改, 私有链部署相关操作详见#03.3.2).
  7. Transaction was not mined within 750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined!.
    解决: 未及时完成合约部署, 确保私有链已经开始挖矿, 原因不详, 再次使用命令部署时成功.
  8. The contract code couldn’t be stored, please check your gas limit.
    智能合约模糊测试编译部署脚本_第13张图片
    解决: ./truffle-config.js文件中gas的值要足够大.
  9. Number can only safely store up to 53 bits
    智能合约模糊测试编译部署脚本_第14张图片
    解决: 原因不详, 猜测可能为上述私有链gensis.json文件中gasLimit值大小超过53bits, 上图的0x800000000暂无此问题.

3. 使用脚本

  1. 根据上述 #1, #2.1, #2.2 安装Truffle并构建一个项目目录
  2. 删除创建的Truffle项目目录下除truffle-config.js以外的文件夹和文件
  3. 按照 #2.4(2) 设置Truffle连接的私有链
  4. 打开用于部署合约的私有链, 解锁账户后进行挖矿
  5. 根据运行环境修改脚本 contrCompDeploy.py 中的路径等参数
  6. 运行脚本 contrCompDeploy.py

你可能感兴趣的:(Something,区块链)