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

Cha*_*kka 6 blockchain ethereum solidity smartcontracts ether

有了下面的可靠性代码,我试图通过智能合约将以太网发送到以太坊钱包地址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)
    }

}
Run Code Online (Sandbox Code Playgroud)

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

参考:

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

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

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

Rag*_*ood 5

你不小心偶然发现了以太坊中鲜为人知的一个"特征".该链实际上有一些预编译合同(黄皮书中的附录E),其中一个生活在0x0000000000000000000000000000000000000001(ecrecover合同).

fail()由于ecrecover合同的回退执行需要的数量超过方法2300 gas转发的数量,因此您的功能会因缺少气体而失败transfer.

0x0地址不是特殊合同,因此常规转接呼叫可以正常工作,就像使用任何其他地址一样.