传送门: 柏链项目学院


1 以太坊智能合约编译

以太坊智能合约编写使用solidity语言,一般情况下我们会在remix环境下进行编译测试,在线环境相对比较稳定。如果不想用在线环境,那我们就需要自己动手来编译代码,并且进行测试。我们都需要准备哪些工具呢?

  • 编译器,solidity语言需要安装solc编译器
  • 以太坊节点,部署合约时需要用到

1.1 编译器安装和准备

安装solc以及solcjs

  1. sudo npm install -g solc solc-cli --save-dev

solc可以将sol代码编译为go语言,solcjs可以将sol代码编译为abi。

solc 使用方式如下:

  1. ykdeMac-mini:abi yekai$ solc -h
  2. Usage:
  3. solc [OPTIONS] [ARGS]
  4. Options:
  5. --out-dir [PATH] Output directory for the compiled contracts (Default is ./contracts)
  6. --optimise If present activate the solc optimiser
  7. -k, --no-color Omit color from output
  8. --debug Show debug information
  9. -h, --help Display help and usage details

不过本人经过实验,这种solc的版本问题仍然会给编译带来很大困扰,因为我还是推荐安装以太坊官方的solidity库,编译就会到solc可执行程序。

下载源码

  1. git clone https://github.com/ethereum/solidity

编译源码,注意此处编译的时候需要cmake,如果系统中不存在,可以提前安装一下。

如果需要安装cmake,可以参考:

  • for ubuntu
  1. sudo apt-get install cmake
  • for mac-os
  1. brew install cmake

cmake存在后可以编译源码了

  1. cd solidity
  2. mkdir build
  3. cd build
  4. cmake .. && make

编译好solc之后需要将它放到$PATH环境变量所对应的某个路径下,本人是直接拷贝到了/usr/local/bin下,当然你如果想建立一个软连接也可以,直接连接的路径是准确的就行!

  1. cp solc /usr/local/bin/

当然我们本篇文章重点讨论的是go语言的问题,所以go语言的安装环境也需要搞定!

1.2 以太坊节点安装和部署

这个网上也有很多文章,我们暂且不展开讨论。也可以到这里来查看区块链技术百科

启动geth,开发时使用开发者模式,相对比较容易一些,开发者模式会提供一个默认账户,这个账户有很多钱,而且使用此账户也无需解锁,但是不要想太多,这个是私链的以太币!

  1. 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语言编写的,目前尚在不断完善中!

  1. cd $GOPATH/src
  2. git clone https://github.com/yekai1003/gosol

进入到目录,可以进行测试

  1. cd gosol

在sol目录下有一个示例智能合约,一个银行存取款业务。

  1. pragma solidity^0.5.0;
  2. contract pdbank {
  3. address public owner;
  4. mapping(address=>uint256) public balances;
  5. uint256 public totalAmount;
  6. string public bankName;
  7. //构造函数
  8. constructor(string memory _bankName) public {
  9. owner = msg.sender;
  10. bankName = _bankName;
  11. }
  12. //充值
  13. function deposit() public payable {
  14. totalAmount += msg.value;
  15. balances[msg.sender] += msg.value;
  16. }
  17. //提现
  18. function withdraw(uint256 _amount) public payable {
  19. if(balances[msg.sender] > _amount) {
  20. balances[msg.sender] -= _amount;
  21. msg.sender.transfer(_amount);
  22. totalAmount -= _amount;
  23. }
  24. }
  25. }

2.1 编译合约代码

本框架可以自动测试合约代码是否有效,集编译、部署、功能测试于一体。

编译本工程

  1. go build -i
  2. mkdir build

templates/templates.toml这个文件是最初的配置文件

  1. [common]
  2. connstr = "http://localhost:8545" #以太坊地址
  3. keydir = "/Users/yekai/eth/data/keystore" #私钥所在目录
  4. contractaddr = "0xe98a031548fc8e8580e1d2d67637045a82b5250c" #合约地址,部署后拿到
  5. buildpath = "build" #合约地址,部署后拿到
  6. Codepath = "callsol.go" #生成目标代码路径
  7. TestCodepath = "testFunc.go" #生成调用时的目标代码路径
  8. TestConfigpath = "config.toml" #生成调用时的目标代码路径
  9. [Deploy]
  10. contractname = "Pdbank" #部署合约函数,合约编译成go语言后,可以得到
  11. fromaddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #部署用的账户地址,需要消耗gas
  12. pass = "123" #账户地址对应的密码
  13. AbiFile = "contracts/pdbank.abi" #编译后ABI文件所在路径

其中连接地址默认私链可以不必改动,keydir是代表私钥存在路径,这个需要修改为自己本机中的位置,还记得geth的启动目录吧,在那里可以找到。

AbiFile这个文件是在编译合约后得到的,所以编译之后可以修改此处!

2.2 生成目标测试代码

编译合约代码

  1. localhost:gosol yekai$ ./gosol comp
  2. templates init ok
  3. [pdbank.sol] <nil>
  4. pdbank.sol
  5. /usr/local/bin/abigen
  6. run complie go ok!! <nil>
  7. run BuildAbi ok!! <nil>

此后可以在contracts看到2个文件

  1. localhost:gosol yekai$ ls contracts/
  2. pdbank.abi pdbank.go

如果合约名字不一样,可以修改一下之前的配置文件地方,对abi文件进行替换。

上面只是完成了第一步,编译代码,接着需要生成自动化的测试代码。

  1. localhost:gosol yekai$ ./gosol build
  2. templates init ok
  3. deploy config begin......
  4. deploy config ok......
  5. ImplRunCode() begin
  6. ImplRunCode() end

可以在build目录得到目标的代码,进入到build目录,可以进行合约代码测试工作了。

  1. cd build
  2. go build -i

可以查看一下命令帮助

  1. localhost:build yekai$ ./build
  2. call build config.init
  3. call build config.init ok
  4. 1 - help :./build 1
  5. 2 - deploy :./build 2
  6. 3 - test totalAmount:./build 3
  7. 4 - test bankName:./build 4
  8. 5 - test balances:./build 5
  9. 6 - test withdraw:./build 6
  10. 7 - test owner:./build 7
  11. 8 - test deposit:./build 8

之前的合约一共有这么多个函数,所以自动化生成这些测试命令,需要先确认一下配置文件config.toml,这里面的fromaddr和pass是部署合约使用,必须是正确的。

  1. [common]
  2. connstr = "http://localhost:8545" #以太坊连接地址
  3. keydir = "/Users/yekai/eth/data/keystore" #以太坊私钥目录
  4. ContractAddr = "0xe98a031548fc8e8580e1d2d67637045a82b5250c" #合约地址,部署后得到
  5. Buildpath = "build" #编译目标目录,默认为build
  6. Codepath = "callsol.go" #编译后的代码文件名
  7. TestCodepath = "testFunc.go" #自动生成的测试用代码文件名
  8. TestConfigpath = "config.toml" #自动生成的配置文件名
  9. [Deploy]
  10. func = "DeployPdbank" #部署函数入口
  11. fromaddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #部署用账户
  12. pass = "123" #部署账户密码
  13. TestAddr = "0x70c53a4c94ccce9ce56effbfcb89b221f986cd41" #测试用账户
  14. TestPass = "123" #测试用账户密码

部署合约试试,可以得到合约地址和收据hash

  1. localhost:build yekai$ ./build 2
  2. call build config.init
  3. call build config.init ok
  4. 0 0x70a4124d3fa01c05c608ae001f135eae06d500295a6907cde74563a2eeba5e0a 36
  5. 0xf375DB17BD4CFF8ff9E16D6665DbF75dED3CB567

合约地址拿到,别忘了去修改配置文件的信息,TestAddr与TestPass也可以一起设置下,否则后面测试的账户是空的

查看一下银行的名称:可以看到yekai

  1. localhost:build yekai$ ./build 4
  2. call build config.init
  3. call build config.init ok
  4. yekai <nil>

充值试试,这个代码callsol.go需要改一下 ,因为默认充值金额为0.

  1. func CallDeposit(addr, pass string) (*types.Transaction, error) {
  2. instance, err := contracts.NewPdbank(common.HexToAddress(Config.Common.ContractAddr), testclient)
  3. if err != nil {
  4. fmt.Println("failed to get contract instance", err)
  5. return nil, err
  6. }
  7. auth, err := MakeAuth(addr, pass)
  8. if err != nil {
  9. fmt.Println("failed to makeAuth", err)
  10. return nil, err
  11. }
  12. auth.Value = big.NewInt(100010)
  13. ts,err := instance.Deposit(auth)
  14. if err != nil {
  15. fmt.Println("failed to call ", err)
  16. return nil, err
  17. }
  18. fmt.Println(ts.ChainId(), ts.Hash().Hex(), ts.Nonce())
  19. return ts , err
  20. }

再重新编译一下,调用充值Deposit

  1. go build -i
  2. localhost:build yekai$ ./build 8
  3. call build config.init
  4. call build config.init ok
  5. 0 0x3083d6000959762c4c8911e4aaca8de9f8700140dd115ca96b1233d7bccd399d 38
  6. localhost:build yekai$ ./build 5
  7. call build config.init
  8. call build config.init ok
  9. 100010 <nil>

可以看到充值和余额查看都ok!

本文先到此结束,后续将为您介绍这个框架是如何开发的!


go打造以太坊合约测试框架的更多相关文章

  1. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

  2. Go语言打造以太坊智能合约测试框架(level3)

    传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...

  3. 一个简单的以太坊合约让imtoken支持多签

    熟悉比特币和以太坊的人应该都知道,在比特币中有2种类型的地址,1开头的是P2PKH,就是个人地址,3开头的是P2SH,一般是一个多签地址.所以在原生上比特币就支持多签.多签的一个优势就是可以多方对一笔 ...

  4. Go语言打造以太坊智能合约测试框架(level2)

    传送门: 柏链项目学院 第二课 智能合约自动化编译 前期内容回顾 之前我们的介绍的是如何通过solc编译智能合约,并且调用智能合约,本节我们继续实践,将智能合约的代码自动化编译以及abi文件生成搞定. ...

  5. Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建

    原文地址:石匠的blog truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约.truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个 ...

  6. 程序员的自我救赎---12.2.3: 虚拟币交易平台(区块链) 下 【C#与以太坊通讯】

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  7. [中文] 以太坊(Ethereum )白皮书

    以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...

  8. 基于以太坊开发的类似58同城的DApp开发与应用案例

    今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你可以在不同垂直行业的solidarity econ ...

  9. 基于docker的以太坊集群的私有链开发环境

    转载博文:https://www.jianshu.com/p/8af386ec5f9e https://www.jianshu.com/p/7994db7a2b89?from=singlemessag ...

随机推荐

  1. 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务

    在上一篇文章中,我们搭建了Hystrix Dashoard,对指定接口进行监控.但是只能对一个接口进行监听,功能比较局限: Turbine:汇总系统内多个服务的数据并显示到 Hystrix Dashb ...

  2. SuperMap iObject入门开发系列之二地下三维管线系统介绍

    本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...

  3. Android studio 2 版本升级 Android studio 3 版本注意事项

    1. compile 需要改成 implementation 或者 api例:implementation 'com.android.support:support-v4:23.4.0'详细规则 ht ...

  4. Sql Server 本地(客户端)连接服务器端操作

    网有很多相关内容,我在此做记录和总结 1.主要是sql server 配置管理工具的配置 在此参考 https://www.cnblogs.com/yougmi/p/4616273.html(再次感谢 ...

  5. NumPy的基本用法

    NumPy简介:NumPy是高性能科学计算和数据分析的基础包.是pandas等其他各种工具的基础NumPy主要功能:ndarray,一个多维数组结构,高效且节省空间无需循环对数组数据进行快速运算的数学 ...

  6. eShopOnContainers 知多少[4]:Catalog microservice

    引言 Catalog microservice(目录微服务)维护着所有产品信息,包括库存.价格.所以该微服务的核心业务为: 产品信息的维护 库存的更新 价格的维护 架构模式 如上图所示,本微服务采用简 ...

  7. ASP.NET Core 快速入门(环境篇)

    [申明]:本人.NET Core小白.Linux小白.MySql小白.nginx小白.而今天要说是让你精通Linux ... 的开机与关机.nginx安装与部署.Core的Hello World .. ...

  8. 2019-中小型公司PHP面试题目记录(附带答案)

    博主是三线省会城市的苦逼技术开发,主攻PHP方向,平时前后端语言也都有涉及,因为都是自学,上手就是框架,工作五年来基础补的不稳,换工作的时候苦不堪言,感觉一上来就问Ngnix的运行机制,php的被编译 ...

  9. javaScript设计模式--观察者模式(observer)

    观察者模式(observer):又被称为 发布-订阅者模式或者消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能耦合. 一.这样的需求 在实现自己的需求,而添加一些功能代码,但是又不想新添加 ...

  10. 从零开始学习PYTHON3讲义(十四)写一个mp3播放器

    <从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...