2

トランザクションを送信して、特定のブロックで実行しようとしています。これは、JS API によると可能のようです。

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendtransaction

誤解していない限り、パラメーター #2 を参照してください。

しかし、これをやろうとするたびに、「無効なアドレス」で失敗します:

incrementer.increment.sendTransaction({from:eth.coinbase}, 28410, function(err, address) {
  if (!err)
    console.log("no err " + address); 
  else
    console.log("err " + address); 
});

...一方、ブロック パラメーター 28410 を削除しています...

incrementer.increment.sendTransaction({from:eth.coinbase}, function(err, address) {
  if (!err)
    console.log("no err " + address); 
  else
    console.log("err " + address); 
});

...うまくいきます。

これで何が起こっているか知っている人はいますか?私がやろうとしていることは可能ですか?

4

2 に答える 2

5

このweb3.eth.sendTransaction(transactionObject [,callback])関数には、実際には 2 つのパラメーターしかありません。

(ここを参照してください: https://github.com/ethereum/web3.js/blob/master/lib/web3/methods/eth.js#L177、オプションの Callback は暗黙的です)。

wiki内の文章はコピペの可能性が高いです。私はこれを今修正したので、ドキュメントを読んでいなくても責めないでください:)

注意。トランザクションを含めるために特別なブロックをターゲットにしたい理由がわかりません。これはマイナーによって決定され、トランザクションの送信者ではなく、トランザクションがブロックに含まれていることを確認することはできません。実行を延期したい場合は、コントラクトを使用する必要があります。


編集:一般的な情報であるため、以下のコメントへの返信を追加してください。

「取引」と「契約」は、異なるレベルの 2 つのものです。「コントラクト」について話すときは、一般的に (イーサリアムのコンテキストで) 完全に実行されるか、まったく実行されないロジックを定義するアプリケーション コードについて話します (まさにブロックチェーンによって保証されるため、信頼できる第三者は必要ありません。したがって、"スマートコントラクト」)。このコードはブロックチェーン上で「生きています」。そのコードはそこに保存され、そこに状態/メモリがあります。

トランザクションは、ブロックチェーン上で「行う」ものです。コントラクトを展開する場合は、それ (コード) をトランザクション オブジェクトに配置し、宛先アドレスなしで (いわばブロックチェーンに) 送信します。デプロイはマイナーによって実行され、コントラクトがブロックチェーンに挿入されます。デプロイメント操作はトランザクションです。

Ether 転送の実行もトランザクションです (基本的に、単純な内部値転送コントラクトを呼び出します)。複雑な「ユーザー」コントラクトの呼び出しと実行は、マイナーによっても実行されるトランザクションであり、結果/結果はブロックチェーンに (現在マイニングされているブロックの一部として) 保存されます。基本的なトランザクションの実行にはコスト (値の送信、デプロイ) があり、複雑なコントラクトの実行 (Gas などを参照) もあります。

(このすべてを 2 語で説明するのは少し難しいです。毎回テキストを読み直し、新しい文を追加します ;) これが役に立てば幸いです。)

于 2015-09-19T07:46:13.523 に答える
0

Ethereum Alarm Clockは、特定の時間またはブロックでコントラクト関数呼び出しをスケジュールできます。現在、メインネットとテストネットに取り組んでいます。ローカル ネットワークに展開することもできます。

  • 将来、指定されたブロックの関数呼び出しのスケジューリングを容易にする Ethereum コントラクト。
  • 関数呼び出しは、任意のコントラクトに対して実行されるようにスケジュールできます
  • スケジューリングは、コントラクトまたはイーサリアム アカウント所有者が行うことができます。
  • イーサリアム ネットワーク内に完全に含まれています。

たとえば、次の契約では支払いが遅れる可能性があります。これは Ethereum Alarm Clock リポジトリの例です:

pragma solidity 0.4.24;

import "contracts/Interface/SchedulerInterface.sol";

/// Example of using the Scheduler from a smart contract to delay a payment.
contract DelayedPayment {

    SchedulerInterface public scheduler;

    address recipient;
    address owner;
    address public payment;

    uint lockedUntil;
    uint value;
    uint twentyGwei = 20000000000 wei;

    constructor(
        address _scheduler,
        uint    _numBlocks,
        address _recipient,
        uint _value
    )  public payable {
        scheduler = SchedulerInterface(_scheduler);
        lockedUntil = block.number + _numBlocks;
        recipient = _recipient;
        owner = msg.sender;
        value = _value;

        uint endowment = scheduler.computeEndowment(
            twentyGwei,
            twentyGwei,
            200000,
            0,
            twentyGwei
        );

        payment = scheduler.schedule.value(endowment)( // 0.1 ether is to pay for gas, bounty and fee
            this,                   // send to self
            "",                     // and trigger fallback function
            [
                200000,             // The amount of gas to be sent with the transaction.
                0,                  // The amount of wei to be sent.
                255,                // The size of the execution window.
                lockedUntil,        // The start of the execution window.
                twentyGwei,    // The gasprice for the transaction (aka 20 gwei)
                twentyGwei,    // The fee included in the transaction.
                twentyGwei,         // The bounty that awards the executor of the transaction.
                twentyGwei * 2     // The required amount of wei the claimer must send as deposit.
            ]
        );

        assert(address(this).balance >= value);
    }

    function () public payable {
        if (msg.value > 0) { //this handles recieving remaining funds sent while scheduling (0.1 ether)
            return;
        } else if (address(this).balance > 0) {
            payout();
        } else {
            revert();
        }
    }

    function payout()
        public returns (bool)
    {
        require(block.number >= lockedUntil);

        recipient.transfer(value);
        return true;
    }

    function collectRemaining()
        public returns (bool) 
    {
        owner.transfer(address(this).balance);
    }
}

プログラムでトランザクションをスケジュールする最も簡単な方法は、@ethereum-alarm-clock/libを使用することです。これは、TypeScript 型を使用した JS ライブラリです (操作が簡単です)。

このライブラリの使用方法に関するテキスト チュートリアルは次のとおりです: https://github.com/ethereum-alarm-clock/ethereum-alarm-clock/wiki/Integration-using-EAC-JavaScript-library

ビデオチュートリアルはこちら: https://youtu.be/DY0QYDQG4lw

于 2016-11-04T09:51:45.717 に答える