Remix是一个基于solidity语言的在线智能合约开发IDE,它提供从编译,调试到部署的全流程工具,功能非常强大。
界面
打开Remix, 就会看到它的工作区:
-
文件夹管理
最左边是文件夹管理,里面列出了当前的工作区里的文件,remix可以支持从本地文件夹读取文件。 -
工作区
正中间是工作区,工作区上半部是代码编辑区,在这里可以写solidity合约。
下半部是日志区,在执行智能合约时,会显示transaction相关的信息。 -
功能区
最右边是功能区,也是最为强大的地方,最主要的就是编译和运行区了,调试区其实也很强大,但是对于一般开发者太难用了(我..)
- 编译
编译里会显示当前合约的编译结果以及编译错误和报警等信息 - 运行
在运行区,你可以选择不同的环境(虚拟环境,内置web3等)部署和运行你的合约。
工作区里的合约代码编译后,可以在这个区里部署和查看。
Remix使用示例
对于智能合约互相调用,我一直有一个疑问,如果用户A调用合约a,而合约a又调用了合约b,那么在合约b的代码执行时,msg.sender是谁?是用户A还是合约a?
为了解决这个问题,我们来亲自动手验证下:
- 打开remix,输入代码
pragma solidity ^0.4.9;
contract Called {
address public caller;
function Test() {
caller = msg.sender;
}
}
contract Caller {
Called public called;
function Caller(address _called) {
called = Called(_called);
}
function Go() {
called.Test();
}
}
代码里写了一个Called和一个Caller合约,当我们调用Caller.Go()时,它会去调用对应Caller的Test()函数, Caller就会将msg.sender记录下来。
-
部署Called
在功能区的编译tab看到编译没有问题后,点开运行tab,我们可以选择browser/ballot.sol:Called合约,然后点击Create,部署。(注意,这里一定把上面的Envonment选项选成Javascript VM)
remix-c1-create.png
这时我们应该能看到Called已经部署了,右下多出了一个已经部署的Caller实例,我们可以点击复制按钮复制该实例的地址。
-
部署Caller
在运行区中间选择Caller合约,这里可以看到它的Create里是可以接收一个参数的,我们把刚刚复制的Called地址复制进去(记得用引号包围)
remix-c2-create.png
点击Create,我们就部署了一个Caller了,该Caller里有一个Called合约的引用。
-
测试
好,我们现在就可以测试啦,点击运行Caller合约的Go函数,可以看到日志里输出了一些transaction信息,但是Called里面的caller值没有更新,我们还需要点一下caller获取当前的最新值。
remix-c2-run.png
可以看到,caller值更新成了0xbbf289d846208c16edc8474705c748aff07732db, 而这个就是下面的Caller合约的地址。
于是我们可以得到结论,当合约再去调用合约时,msg.sender会是上一个合约的地址,而不是交易发起者的地址。
网友评论