以下の堅牢なコードを使用して、スマート コントラクト経由でイーサリアム ウォレット アドレス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にイーサを送信できないのはなぜですか?
参照:
アップデート:
イーサリアムのコンパイル済みコントラクトについて調査した後、スマート コントラクトを介してイーサを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()
です。それは働いています:)