以太坊系列之十一: 零起步使用remix开发智能合约
一步一步使用remix开发智能合约
最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要翻墙才能访问(自行解决).
1.打开remix
注意地址如果是https开头的,要换成http,否则就没法访问本地的http rpc了.
remix地址,打开以后会看到一个Ballot.sol文件,这是一个测试投票程序
2.打开本地的geth
本地的geth记得一定要开启rpc,下面是我自己的参数
ggeth.exe --datadir=d:/privnet --networkid 89120348581 --rpc --rpccorsdomain "*" --rpcapi "eth,admin,web3,net,debug"
--rpc 表示启动http rpc通道,否则只有本地ipc通道
--rpccorsdomain "*" 是允许跨域访问,否则http://ethereum.github.io/在对http://localhost:8545进行 http rpc通信时会被浏览器阻塞
--rpcapi "eth,admin,web3,net,debug" 由于安全起见,geth启动http rpc的时候是禁止了admin,debug等模块的,而我们想要通过remix来调试solidity就必须给与这些权限.
3. 配置remix
remix的Contract标签下的Environment不能是默认的Javascript VM,这样是没法运行智能合约的,必须选择Web3 Provider,另一个Injected Web3在我电脑上点了没有任何反应,不晓得什么原因.
具体如下图:

这时候浏览器会提示你链接http://localhost:8545 , 这时候确保你的geth已经启动,并且添加了--rpc参数,这里如果访问的是https://ethereum.github.io/browser-solidity,
还是会失败的,因为浏览器会禁止在https模式下去访问http地址.
如果成功,那么你就可以在Account下拉框中看到你自己的账户信息,如果没有看到那就是上面的某个步骤出错了.
4. 部署合约
点击Create按钮就可以创建合约了.
这时候最常见的错误有两个,一是账户没有解锁,那你就在geth console中调用personal.unlockAccount来解锁;二是余额不足.
当然还有一个就是如果你是在私链上,记得要启动miner,否则会一直不成功.
成功以后,就会看到下面的信息

会告诉你在花费了多少gas,合约的地址等信息.
还有就是下面会出现合约可以调用的函数,这时候你就可以切换上面的账户进行合约调用了.和普通的函数调用差不多.
就是要记得,这个是发生在区块链上的,每次调用都会花费以太币.
5.调试合约
调试也就是分步执行某个事务,这里的事务实际上就是一次合约调用,我这里使用的合约如下:
pragma solidity ^0.4.0;
contract Donation {
address owner;
event fundMoved(address _to, uint _amount);
modifier onlyowner { if (msg.sender == owner) _; }
address[] _giver;
uint[] _values;
function Donation() {
owner = msg.sender;
}
function donate() payable {
addGiver(msg.value);
}
function moveFund(address _to, uint _amount) onlyowner {
if (_amount <= this.balance) {
if (_to.send(this.balance)) {
fundMoved(_to, _amount);
} else {
throw;
}
} else {
throw;
}
}
function addGiver(uint _amount) internal {
_giver.push(msg.sender);
_values.push(_amount);
}
}
create 成功以后会出现两个调用按钮,donate和moveFund两个外部可调用函数. 其中donate是没有参数的,moveFund要有两个参数.
点击donate,会在区块链上执行该调用,结果如下:
Result: {
"blockHash": "0x05ff0a4b8680255fc2f8fd270ff29fc2658a4868bd4a834367e5292aa8c91235",
"blockNumber": 4471,
"contractAddress": null,
"cumulativeGasUsed": 88115,
"from": "0x1a9ec3b0b807464e6d3398a59d6b0a369bf422fa",
"gasUsed": 88115,
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"root": "0xf50ef054ab10044cb0ae253121abd8a971abaeb0b69d29bbf5d3ef97652292d7",
"to": "0xf77165817ad6e07cf32b16b2d6e64e3c85ca7ffc",
"transactionHash": "0xdf4d91c207cf8d7acee3c64add6a994039cf77d27e07e85633e7953e35e542e6",
"transactionIndex": 0
}
可以看到该事务发生在4471区块上,在该区块中的事务索引是0(因为是私链,肯定只会有这一个事务).
有了这些信息,我们就可以去调试这个调用
切换到Debugger模块:
如果按钮下面有一个The method debug_traceTransaction does not exist/is not available,那是因为geth启动的时候没有添加参数
--rpcapi "eth,admin,web3,net,debug"
这时候我们就可以在代码中设置好断点,然后启动,程序就会停在断点处,我们可以在右侧的Solidity State中看到变量的变化.如果想要比较好的调试,还是需要懂一些evm的指令.
否则这样的调试感觉也意义不大,和js中按照语句调试不一样,这里主要是针对指令的调试,一句简单的_giver.push(msg.sender);需要十几条指令.

当然以后随着remix的发展,调试应该会做的越来越好.
以太坊系列之十一: 零起步使用remix开发智能合约的更多相关文章
- 以太坊系列之十六: 使用golang与智能合约进行交互
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- 以太坊系列之十七: 使用web3进行合约部署调用以及监听
以太坊系列之十七: 使用web3进行智能合约的部署调用以及监听事件(Event) 上一篇介绍了使用golang进行智能合约的部署以及调用,但是使用go语言最大的一个问题是没法持续监听事件的发生. 比如 ...
- 以太坊系列之十六:golang进行智能合约开发
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- 以太坊系列之一: 以太坊RLP用法-以太坊源码学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- 以太坊系列之十八: 百行go代码构建p2p聊天室
百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3 ...
- 以太坊系列之六: p2p模块--以太坊源码学习
p2p模块 p2p模块对外暴露了Server关键结构,帮助上层管理复杂的p2p网路,使其集中于Protocol的实现,只关注于数据的传输. Server使用discover模块,在指定的UDP端口管理 ...
- 以太坊系列之四: 使用atomic来避免lock
使用atomic来避免lock 在程序中为了互斥,难免要用锁,有些时候可以通过使用atomic来避免锁, 从而更高效. 下面给出一个以太坊中的例子,就是MsgPipeRW,从名字Pipe可以看出, 他 ...
- 以太坊系列之三: 以太坊的crypto模块--以太坊源码学习
以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...
- 以太坊系列之二: 单调时间monotime-以太坊源码学习
在程序中需要测量时间时最好使用monotime.Now()而不是time.Now(),相比之下前者更准确. 来个示例: func main() { var start, elapsed time.Du ...
随机推荐
- 阿里Java开发规范记录(一)
近日,从网上下载了阿里云栖社区发布的<阿里巴巴Java开发手册(正式版)>v1.1.0版.从编程以来,一直苦于没有相关的.全面的.靠谱的规范可以参考,有了这手册,日后编程也算是找到了依 ...
- PHP读取文件夹数据,并分页
protected function read_all ($dir){ // 确保目录有权限进入 if(!is_dir($dir)) return false; $handle = opendir($ ...
- 第13章 Spring框架的设计理念与设计模式分析
13.1 Spring的骨骼架构 最核心的组件是:Core, Context, Bean. 13.1.1 Spring的设计理念 Spring最核心的组件是Bean组件.Spring解决的最关键的问题 ...
- windows提权辅助工具koadic
项目地址:https://github.com/zerosum0x0/koadic ┌─[root@sch01ar]─[/sch01ar] └──╼ #git clone https://github ...
- Deep Learning 学习笔记(4):Logistic Regression 逻辑回归
逻辑回归主要用于解决分类问题,在现实中有更多的运用, 正常邮件or垃圾邮件 车or行人 涨价or不涨价 用我们EE的例子就是: 高电平or低电平 同时逻辑回归也是后面神经网络到深度学习的基础. (原来 ...
- 2017年排名前15的数据科学python库
2017年排名前15的数据科学python库 2017-05-22 Python程序员 Python程序员 Python程序员 微信号 pythonbuluo 功能介绍 最专业的Python社区,有每 ...
- nat123软件windows版
转自:http://www.nat123.com/pages_8_565.jsp 同时支持内网和公网IP.只要可以上网,即可将所有应用发布外网. >>nat123客户端windows版本软 ...
- 下载tomcat安装版
1.我们首先在浏览器的地址栏中输入下载地址,如下: Tomcat下载网站链接:http://tomcat.apache.org/ 大家注意:以上下载链接中以zip或gz结尾的都是免安装版的,我们要下载 ...
- 2014蓝桥杯B组初赛试题《李白打酒》
题目描述: 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上 ...
- 【微信公众平台开发】微信JS-SDK开发,信公众平台js-sdk
根据微信开发文档步骤如下: 1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. JS接口安全域名设置 mi.com(前面不用带www/http,域名必须备案过) 2 ...