2

remix.ethereum.orgのブロックハッシュ機能に問題があります。異なるコードで何度か試みたにもかかわらず、ブロックハッシュ関数は常に問題を引き起こし、その結果、すべての変数がゼロの値で返されます。

以下の場合、_previousBlockNumber変数は常にゼロを返します。ブロックハッシュ関数の行がコメントアウトされている場合、エラーは発生せず、少なくとも_previousBlockNumber変数は正しく返されます。

いくつかの異なるバージョンのコンパイラを試しました。

pragma solidity ^0.5.5;
contract Test {
    constructor() public {
    }
    function rand() public view returns(uint,bytes32) {
        uint _previousBlockNumber;
        bytes32 _previousBlockHash;
        _previousBlockNumber = uint(block.number - 1);
        bytes32 _previousBlockHash = bytes32(blockhash(_previousBlockNumber)); 
        return (_previousBlockNumber,_previousBlockHash);
    }   
}

バグの問題ですか?

助けてくれてありがとう。

4

1 に答える 1

1

このコードを実行して問題を解決しようとしましたが、いくつかの変更を加えて機能しています。このアドレスのRinkebey Testnetで見つけることができる同じ契約0x86ee6d633fd691e77dc79cbdb2a9fb108f79ecbd.

pragma solidity ^0.5.5;
contract Test {
    uint256 i;
    constructor() public {
    }
    function rand() public view returns(uint,bytes32) {
        uint _previousBlockNumber;
        bytes32 _previousBlockHash;
        _previousBlockNumber = uint(block.number - 1);
        _previousBlockHash = bytes32(blockhash(_previousBlockNumber)); 
        return (_previousBlockNumber,_previousBlockHash);
    }  

    function setI(uint256 k) public{
        i = k;
    }
}

最初は、関数_previousBlockHashの行で 2 回、2 回宣言していました。blockhash私はそれを修正し、正常に動作します。

第 2 に、現在のコントラクト コードでは、コントラクトの状態を変更せず、トランザクションも行わず、rand()単なる呼び出しであり、他のブロックを追加しません。だからずっと残る0。テスト用にダミーのトランザクション関数を 1 つ追加しましたが、現在は正常に動作しています。

最後に、ライブ テスト ネットワークでこれを実行して、実際の動作を確認してください。それがうまくいくことを願っています。

スクリーンショット

于 2019-03-19T07:19:17.703 に答える