2018-03-09 Solidity智能合约开发测试环境搭建

Solidity智能合约开发测试环境搭建

以太坊合约开发工具非常多,但是功能上各有优缺点,因此如何选择搭配一套比较好用的开发和测试环境就非常重要。我在开发实践中摸索发现了一种方便快捷的开发和测试方法。

总结下来就是:

1、 使用https://ethfiddle.com/进行代码开发,调试

2、 使用testrpc和geth做发布前功能测试

3、 使用metamask进行发布

1、使用https://ethfiddle.com/进行代码开发,调试

打开网站https://ethfiddle.com/,这个工具使用非常简单,只需要在左边的编辑框内输入代码,下面的error就会同步编译并展示错误信息,代码编辑完成后,直接点击右边的deploy就可以发布合约,合约发布后,右边框内可以出现合约可以调用的函数,

点击call就可以调用合约对应的代码

注意:如果函数名称为空,我们可以先写个名字用来调试,发布的时候去除这个名称就可以了;同理对private的函数也可以先设置为public来调试

2、 使用testrpc和geth做发布前功能测试

本文在windows开发环境下,当然其他环境也验证了可以成功

我们需要安装testrpc和geth

A、安装testrpc

npm install -g ethereumjs-testrpc

运行testrpc后显示版本信息:EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)

B、geth 下载:

https://geth.ethereum.org/downloads/

运行geth version后显示版本信息

Version: 1.8.1-stable

Git Commit: 1e67410e88d2685bc54611a7c9f75c327b553ccc

C、在cmd窗口启动testrpc

直接testrpc回车

D、在另外一个cmd窗口启动geth

输入:geth attach http://127.0.0.1:8545

E、在geth控制台创建帐号并转账

转账测试:

eth.accounts

personal.newAccount("123456")

eth.getBalance(eth.accounts[0])

eth.coinbase

eth.getBalance(eth.accounts[10])

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[10],value:web3.toWei(5,'ether')})

F、合约发布

https://ethfiddle.com/ 网站没有给我们生成web3脚本,我们这里使用remix来自动生成脚本

打开http://remix.ethereum.org,新增文件Token.sol,内容如下:

pragma solidity ^0.4.18;

contract Token {

    address issuer;

    mapping (address => uint) balances;

    event Issue(address account, uint amount);

    event Transfer(address from, address to, uint amount);

    function Token() public payable{

        issuer = msg.sender;

    }

    function issue(address account, uint amount) public {

        assert(msg.sender == issuer);

        balances[account] += amount;

    }

    function transfer(address to, uint amount) public {

        assert (balances[msg.sender] >= amount);

        balances[msg.sender] -= amount;

        balances[to] += amount;

        Transfer(msg.sender, to, amount);

    }

    function getBalance(address account) public constant returns (uint) {

        return balances[account];

    }

}

选择右边的编译,然后点击detail,选择WEB3DEPLOY,点击复制,把下面的内容放入geth console中

var tokenContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Transfer","type":"event"}]);

var token = tokenContract.new(

  {

    from: web3.eth.accounts[0],

    data: '0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103d78061005e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063867904b41461005c578063a9059cbb1461009e578063f8b2cb4f146100e0575b600080fd5b341561006757600080fd5b61009c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061012d565b005b34156100a957600080fd5b6100de600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506101d9565b005b34156100eb57600080fd5b610117600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610362565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561018857600080fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561022557600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509190505600a165627a7a72305820fee6d10733c12d160654c96b4b873c8b909925a0a5900cdda3a44bf8a9bba03f0029',

    gas: '4700000'

  }, function (e, contract){

    console.log(e, contract);

    if (typeof contract.address !== 'undefined') {

        console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);

    }

})

成功编译,显示:

Contract mined! address: 0xd481dea9b8e8399c263e7e77bb09d9e617da2a92 transactionH

ash: 0xec04e48ed031122d5fc57481aefa55c9bc79cd863ce6f364eec79e47d3608d0e

注意:上面是两行web3代码,我们分别复制到geth控制台,然后回车,否则可能看不到Contract mined! Address这些信息

G、合约测试

在geth控制台,测试充值:

token.issue(eth.accounts[0], 100, {from: eth.accounts[0]});

查看余额:

token.getBalance(eth.accounts[0])

转账:

token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})

查看余额:

token.getBalance(eth.accounts[0])

token.getBalance(eth.accounts[1])

3、使用metamask进行发布

这个参考http://liyuechun.org/2017/09/03/solidity-MetaMask/ ,使用remix和metamask搭配,在metamask里面选择main network就可以发布了,只是前提是要去买点eth。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,562评论 18 139
  • 群里又吵架,也不知道这是第几次吵架了。 以前大家吵得多的时候,往往吵得不分胜负,乱得一锅粥。大熊老师为了能够让大家...
    王守黑阅读 386评论 0 0
  • 感觉有些人有些事,怎么说呢 开始是既要当婊子 又要立牌坊。现在好了 牌坊立好了,又有倒塌的风险,只好在暗地里当婊子...
    炼心清秋阅读 108评论 0 0
  • 那天闺密阿心突然找到我说她心水一男生,迷恋得昏天地黑,让我给她出出主意。 我自然得端出一副女王的架势,意味深长地告...
    满树核桃阅读 7,891评论 3 6