主页 > imtoken最新下载 > 以太坊系列十一:使用 remix 从零开始开发智能合约

以太坊系列十一:使用 remix 从零开始开发智能合约

imtoken最新下载 2023-08-30 05:09:54

--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 在我的电脑上点击没有任何反应。 我不知道为什么。

详情如下所示:

选择Web3 Provider

这时候浏览器会提示你链接: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,我们就可以去调试这个调用了

切换到调试器模块:

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的发展,调试应该会越来越好。