主页 > imtoken最新下载 > 以太坊系列十一:使用 remix 从零开始开发智能合约
以太坊系列十一:使用 remix 从零开始开发智能合约
--rpccorsdomain "*" 是允许跨域访问,否则在执行http rpc通信时会被浏览器拦截到:8545
--rpcapi "eth,admin,web3,net,debug" 为了安全起见,geth启动http rpc时,admin和debug等模块是禁止的,如果我们要通过remix调试solidity,就必须给这些权限。
3.配置混音
remix的Contract选项卡下的Environment不能是默认的Javascript VM,这样智能合约无法运行,必须选择Web3 Provider。 另一个 Injected Web3 在我的电脑上点击没有任何反应。 我不知道为什么。
详情如下所示:
这时候浏览器会提示你链接:8545。这时候要确保你的geth已经启动,并且加上了--rpc参数。 如果你来这里参观,
还是会失败,因为浏览器会禁止以https方式访问http地址。
如果成功,那么你可以在账户下拉框中看到自己的账户信息,如果不成功以太坊合约地址计算java,说明上面的某个步骤出错了。
4.部署合约
单击创建按钮创建合同。
这个时候最容易出现两种错误,一种是账户没有解锁,那么可以在geth控制台调用personal.unlockAccount来解锁; 二是余额不足。
当然还有一个就是如果你是在私有链上,记得开启矿机,不然一直不成功。
成功后会看到如下信息
它会告诉你消耗了多少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);
}
}
创建成功后,会出现两个调用按钮,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(因为是私有链,交易肯定只有一笔)。
有了这些信息以太坊合约地址计算java,我们就可以去调试这个调用了
切换到调试器模块:
如果按钮下有一个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的发展,调试应该会越来越好。