【问题标题】:Why we can't send ether to ethereum address 0x1 via smart contracts为什么我们不能通过智能合约将以太币发送到以太坊地址 0x1
【发布时间】:2018-09-02 18:28:35
【问题描述】:

使用下面的 Solidity 代码,我尝试通过智能合约将以太币发送到以太坊钱包地址 0x1,但它失败了。但是,当我尝试直接从我的钱包向地址 0x1 发送以太币时,它就成功了。

pragma solidity ^0.4.24;

contract Transfer {

    constructor () public payable {
        // Deploy contract with 1000 wei for testing purpose
        require(msg.value == 1000);
    }

    function done() public {
        address(0).transfer(1); // Transaction success
    }

    function fail() public {
        address(1).transfer(1); // Transaction failed
    }

    function send(address account) public {
        account.transfer(1); // Transaction success (except 0x1)
    }

}

为什么我们不能通过合约将以太币发送到地址0x1

参考:

  1. 直接从我的钱包发送以太币是成功的 https://ropsten.etherscan.io/tx/0x1fdc3a9d03e23b0838c23b00ff99739b775bf4dd7b5b7f2fa38043056f731cdc

  2. done() 函数成功 https://ropsten.etherscan.io/tx/0xd319c40fcf50bd8188ae039ce9d41830ab795e0f92d611b16efde0bfa1ee82cd

  3. fail() 函数失败 https://ropsten.etherscan.io/tx/0x0c98eafa0e608cfa66777f1c77267ce9bdf81c6476bdefe2a7615158d17b59ad


更新:

在研究了以太坊预编译合约后,我在下面写了这个solidity代码,通过智能合约将以太币发送到0x1地址并且它正在工作。

pragma solidity ^0.4.24;

contract Learning {

    constructor () public payable {
        // Deploy contract with 1000 wei for testing purpose
        require(msg.value == 1000);
    }

    function test() public returns (bool) {
        // Set minimum gas limit as 700 to send ether to 0x1
        transfer(0x0000000000000000000000000000000000000001, 1, 700);
        return true;
    }

    function transfer(address _account, uint _wei, uint _gas) private {
        require(_account.call.value(_wei).gas(_gas)());
    }
}

为了测试,只需部署 1000 wei 的合约并执行test() 函数。它正在工作:)

【问题讨论】:

    标签: blockchain ethereum solidity smartcontracts ether


    【解决方案1】:

    您无意中发现了以太坊鲜为人知的“功能”之一。该链实际上有一些预编译的合约(黄皮书附录 E),其中一个位于 0x0000000000000000000000000000000000000001ecrecover 合约)。

    由于ecrecover 合约的后备执行将需要比transfer 方法转发的2300 gas 更多的内容,因此您的fail() 函数因gas 耗尽而失败。

    0x0 地址不是一个特殊的合约,所以普通的转帐调用就可以正常工作,就像使用任何其他地址一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多