使用以下这种固定代码,我尝试通过智能合约将以太币发送到以太坊钱包地址 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)
    }

}



引用:
  • 从我的钱包直接发送以太币是成功的
    https://ropsten.etherscan.io/tx/0x1fdc3a9d03e23b0838c23b00ff99739b775bf4dd7b5b7f2fa38043056f731cdc
  • done()函数成功
    https://ropsten.etherscan.io/tx/0xd319c40fcf50bd8188ae039ce9d41830ab795e0f92d611b16efde0bfa1ee82cd
  • fail()函数失败
    https://ropsten.etherscan.io/tx/0x0c98eafa0e608cfa66777f1c77267ce9bdf81c6476bdefe2a7615158d17b59ad


  • 更新:

    在研究了以太坊的预编译合约之后,我在坚固性代码下面编写了此代码,以通过智能合约将以太币发送到 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()函数。它正在工作:)

    最佳答案

    您不小心偶然发现了以太坊鲜为人知的“功能”之一。该链实际上有一些预编译的契约(Contract)(黄皮书中的附录E),其中一个存在于0x0000000000000000000000000000000000000001(ecrecover契约(Contract))中。

    由于fail()契约(Contract)的后备执行将需要比ecrecover方法转发的2300 gas更多的事实,因此transfer函数失败而无法运作。
    0x0地址不是特殊契约(Contract),因此常规转移调用可以正常工作,就像使用其他任何地址一样。

    关于blockchain - 为什么我们无法通过智能合约将以太币发送到以太坊地址0x1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52139936/

    10-16 08:41