6

以下の堅牢なコードを使用して、スマート コントラクト経由でイーサリアム ウォレット アドレス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. ウォレットからイーサを直接送信することに成功しまし

  2. done () 関数は成功です

  3. fail () 関数が失敗し ました


アップデート:

イーサリアムのコンパイル済みコントラクトについて調査した後、スマート コントラクトを介してイーサを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()です。それは働いています:)

4

1 に答える 1