go打造以太坊合约测试框架

传送门: 柏链项目学院
1 以太坊智能合约编译
以太坊智能合约编写使用solidity语言,一般情况下我们会在remix环境下进行编译测试,在线环境相对比较稳定。如果不想用在线环境,那我们就需要自己动手来编译代码,并且进行测试。我们都需要准备哪些工具呢?
- 编译器,solidity语言需要安装solc编译器
- 以太坊节点,部署合约时需要用到
1.1 编译器安装和准备
安装solc以及solcjs
sudo npm install -g solc solc-cli --save-dev
solc可以将sol代码编译为go语言,solcjs可以将sol代码编译为abi。
solc 使用方式如下:
ykdeMac-mini:abi yekai$ solc -h
Usage:
solc [OPTIONS] [ARGS]
Options:
--out-dir [PATH] Output directory for the compiled contracts (Default is ./contracts)
--optimise If present activate the solc optimiser
-k, --no-color Omit color from output
--debug Show debug information
-h, --help Display help and usage details
不过本人经过实验,这种solc的版本问题仍然会给编译带来很大困扰,因为我还是推荐安装以太坊官方的solidity库,编译就会到solc可执行程序。
下载源码
git clone https://github.com/ethereum/solidity
编译源码,注意此处编译的时候需要cmake,如果系统中不存在,可以提前安装一下。
如果需要安装cmake,可以参考:
- for ubuntu
sudo apt-get install cmake
- for mac-os
brew install cmake
cmake存在后可以编译源码了
cd solidity
mkdir build
cd build
cmake .. && make
编译好solc之后需要将它放到$PATH环境变量所对应的某个路径下,本人是直接拷贝到了/usr/local/bin下,当然你如果想建立一个软连接也可以,直接连接的路径是准确的就行!
cp solc /usr/local/bin/
当然我们本篇文章重点讨论的是go语言的问题,所以go语言的安装环境也需要搞定!
1.2 以太坊节点安装和部署
这个网上也有很多文章,我们暂且不展开讨论。也可以到这里来查看区块链技术百科
启动geth,开发时使用开发者模式,相对比较容易一些,开发者模式会提供一个默认账户,这个账户有很多钱,而且使用此账户也无需解锁,但是不要想太多,这个是私链的以太币!
geth --rpc --rpcport "8545" --rpccorsdomain "*" --datadir ./data/ --nodiscover --networkid 18 --rpcapi "db,eth,net,web3,personal" --gasprice 0 --dev --dev.period 1 console 2> 1.log
启动的目录很关键,后面要用到,其目录下会有data目录,私钥就存放在其中的一个子目录下。
2 自动化生成测试代码
下载自动化测试代码框架,这个是基于go语言编写的,目前尚在不断完善中!
cd $GOPATH/src
git clone https://github.com/yekai1003/gosol
进入到目录,可以进行测试
cd gosol
在sol目录下有一个示例智能合约,一个银行存取款业务。
pragma solidity^0.5.0;
contract pdbank {
address public owner;
mapping(address=>uint256) public balances;
uint256 public totalAmount;
string public bankName;
//构造函数
constructor(string memory _bankName) public {
owner = msg.sender;
bankName = _bankName;
}
//充值
function deposit() public payable {
totalAmount += msg.value;
balances[msg.sender] += msg.value;
}
//提现
function withdraw(uint256 _amount) public payable {
if(balances[msg.sender] > _amount) {
balances[msg.sender] -= _amount;
msg.sender.transfer(_amount);
totalAmount -= _amount;
}
}
}
2.1 编译合约代码
本框架可以自动测试合约代码是否有效,集编译、部署、功能测试于一体。
编译本工程
go build -i
mkdir build
templates/templates.toml这个文件是最初的配置文件
[common]
connstr = "http://localhost:8545" #以太坊地址
keydir = "/Users/yekai/eth/data/keystore" #私钥所在目录
contractaddr = "0xe98a031548fc8e8580e1d2d67637045a82b5250c" #合约地址,部署后拿到
buildpath = "build" #合约地址,部署后拿到
Codepath = "callsol.go" #生成目标代码路径
TestCodepath = "testFunc.go" #生成调用时的目标代码路径
TestConfigpath = "config.toml" #生成调用时的目标代码路径
[Deploy]
contractname = "Pdbank" #部署合约函数,合约编译成go语言后,可以得到
fromaddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #部署用的账户地址,需要消耗gas
pass = "123" #账户地址对应的密码
AbiFile = "contracts/pdbank.abi" #编译后ABI文件所在路径
其中连接地址默认私链可以不必改动,keydir是代表私钥存在路径,这个需要修改为自己本机中的位置,还记得geth的启动目录吧,在那里可以找到。
AbiFile这个文件是在编译合约后得到的,所以编译之后可以修改此处!
2.2 生成目标测试代码
编译合约代码
localhost:gosol yekai$ ./gosol comp
templates init ok
[pdbank.sol] <nil>
pdbank.sol
/usr/local/bin/abigen
run complie go ok!! <nil>
run BuildAbi ok!! <nil>
此后可以在contracts看到2个文件
localhost:gosol yekai$ ls contracts/
pdbank.abi pdbank.go
如果合约名字不一样,可以修改一下之前的配置文件地方,对abi文件进行替换。
上面只是完成了第一步,编译代码,接着需要生成自动化的测试代码。
localhost:gosol yekai$ ./gosol build
templates init ok
deploy config begin......
deploy config ok......
ImplRunCode() begin
ImplRunCode() end
可以在build目录得到目标的代码,进入到build目录,可以进行合约代码测试工作了。
cd build
go build -i
可以查看一下命令帮助
localhost:build yekai$ ./build
call build config.init
call build config.init ok
1 - help :./build 1
2 - deploy :./build 2
3 - test totalAmount:./build 3
4 - test bankName:./build 4
5 - test balances:./build 5
6 - test withdraw:./build 6
7 - test owner:./build 7
8 - test deposit:./build 8
之前的合约一共有这么多个函数,所以自动化生成这些测试命令,需要先确认一下配置文件config.toml,这里面的fromaddr和pass是部署合约使用,必须是正确的。
[common]
connstr = "http://localhost:8545" #以太坊连接地址
keydir = "/Users/yekai/eth/data/keystore" #以太坊私钥目录
ContractAddr = "0xe98a031548fc8e8580e1d2d67637045a82b5250c" #合约地址,部署后得到
Buildpath = "build" #编译目标目录,默认为build
Codepath = "callsol.go" #编译后的代码文件名
TestCodepath = "testFunc.go" #自动生成的测试用代码文件名
TestConfigpath = "config.toml" #自动生成的配置文件名
[Deploy]
func = "DeployPdbank" #部署函数入口
fromaddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #部署用账户
pass = "123" #部署账户密码
TestAddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #测试用账户
TestPass = "123" #测试用账户密码
部署合约试试,可以得到合约地址和收据hash
localhost:build yekai$ ./build 2
call build config.init
call build config.init ok
0 0x70a4124d3fa01c05c608ae001f135eae06d500295a6907cde74563a2eeba5e0a 36
0xf375DB17BD4CFF8ff9E16D6665DbF75dED3CB567
合约地址拿到,别忘了去修改配置文件的信息,TestAddr与TestPass也可以一起设置下,否则后面测试的账户是空的
查看一下银行的名称:可以看到yekai
localhost:build yekai$ ./build 4
call build config.init
call build config.init ok
yekai <nil>
充值试试,这个代码callsol.go需要改一下 ,因为默认充值金额为0.
func CallDeposit(addr, pass string) (*types.Transaction, error) {
instance, err := contracts.NewPdbank(common.HexToAddress(Config.Common.ContractAddr), testclient)
if err != nil {
fmt.Println("failed to get contract instance", err)
return nil, err
}
auth, err := MakeAuth(addr, pass)
if err != nil {
fmt.Println("failed to makeAuth", err)
return nil, err
}
auth.Value = big.NewInt(100010)
ts,err := instance.Deposit(auth)
if err != nil {
fmt.Println("failed to call ", err)
return nil, err
}
fmt.Println(ts.ChainId(), ts.Hash().Hex(), ts.Nonce())
return ts , err
}
再重新编译一下,调用充值Deposit
go build -i
localhost:build yekai$ ./build 8
call build config.init
call build config.init ok
0 0x3083d6000959762c4c8911e4aaca8de9f8700140dd115ca96b1233d7bccd399d 38
localhost:build yekai$ ./build 5
call build config.init
call build config.init ok
100010 <nil>
可以看到充值和余额查看都ok!
本文先到此结束,后续将为您介绍这个框架是如何开发的!

go打造以太坊合约测试框架的更多相关文章
- Go语言打造以太坊智能合约测试框架(level1)
传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...
- Go语言打造以太坊智能合约测试框架(level3)
传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...
- 一个简单的以太坊合约让imtoken支持多签
熟悉比特币和以太坊的人应该都知道,在比特币中有2种类型的地址,1开头的是P2PKH,就是个人地址,3开头的是P2SH,一般是一个多签地址.所以在原生上比特币就支持多签.多签的一个优势就是可以多方对一笔 ...
- Go语言打造以太坊智能合约测试框架(level2)
传送门: 柏链项目学院 第二课 智能合约自动化编译 前期内容回顾 之前我们的介绍的是如何通过solc编译智能合约,并且调用智能合约,本节我们继续实践,将智能合约的代码自动化编译以及abi文件生成搞定. ...
- Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建
原文地址:石匠的blog truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约.truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个 ...
- 程序员的自我救赎---12.2.3: 虚拟币交易平台(区块链) 下 【C#与以太坊通讯】
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- [中文] 以太坊(Ethereum )白皮书
以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...
- 基于以太坊开发的类似58同城的DApp开发与应用案例
今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...
- 基于docker的以太坊集群的私有链开发环境
转载博文:https://www.jianshu.com/p/8af386ec5f9e https://www.jianshu.com/p/7994db7a2b89?from=singlemessag ...
随机推荐
- openlayers4 入门开发系列之地图空间查询篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- mssql sqlserver 给已存在表添加新的字段及字段备注的方法
转自:http://www.maomao365.com/?p=8102 摘要: 下文讲述向已存在表上添加新字段及字段备注的方法,如下所示: 实验环境:sql server 2008 R2 1. 添加新 ...
- aspnetcore.webapi实战k8s健康探测机制 - kubernetes
1.浅析k8s两种健康检查机制 Liveness k8s通过liveness来探测微服务的存活性,判断什么时候该重启容器实现自愈.比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可 ...
- GitHub开源:SQLite 增强组件 Sheng.SQLite.Plus
Github:https://github.com/iccb1013/Sheng.SQLite.Plus Sheng.SQLite.Plus 是一个对直接使用 ADO.NET 方式操作 SQLite ...
- 吴恩达机器学习笔记61-应用实例:图片文字识别(Application Example: Photo OCR)【完结】
最后一章内容,主要是OCR的实例,很多都是和经验或者实际应用有关:看完了,总之,善始善终,继续加油!! 一.图像识别(店名识别)的步骤: 图像文字识别应用所作的事是,从一张给定的图片中识别文字.这比从 ...
- 使用nvm管理node不同版本,安装,环境配置,切换不同版本的node版本
文章包含以下内容: 一.下载地址 二.nvm-noinstall.zip安装 三.nvm-setup.zip安装 四.测试安装以及使用 一.下载地址 https://github.com/coreyb ...
- .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.什么是Tracing? 微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错 ...
- Android 性能测试优质实践汇总
这两天把testerhome上的关于Android 性能测试的精品文章看了一遍,很有收获,学习到了Android 性能测试该关注的一些细节.我所说的“精品”是指对我自己有启发的文章,可以被自己运用起来 ...
- springboot~WebTestClient的使用
在使用springboot进行开发时,单元测试是必要的,当你建立一个spring项目时,它会为我们自己生成一个测试项目,当你的项目开始过程中,测试用例是同时要进行的,我们在进行WEB层的集成测试时,可 ...
- 一套代码小程序&Web&Native运行的探索02
接上文:一套代码小程序&Web&Native运行的探索01,本文都是一些探索性为目的的研究学习,在最终版输出前,内中的内容可能会有点乱 参考: https://github.com/f ...