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 ,可选的回调是隐式的)。

wiki 中的文本可能是复制和过去的错误。我现在解决了这个问题,所以请不要责怪没有阅读文档:)

注意。我不明白您为什么希望针对包含交易的特殊区块。你永远无法确定你的交易是否包含在一个区块中,因为这是由矿工而不是交易提交者决定的。如果您希望延迟执行,则需要使用合约。


编辑:在下面添加对评论的回复,因为它是一般信息。

“交易”和“合同”是不同层次的两件事。当谈到“合约”时,通常(在以太坊的上下文中)定义一个逻辑的应用程序代码,该逻辑要么完全执行,要么根本不执行(由区块链确保,因此不需要第三个受信任方,因此“智能合约”)。该代码“存在”在区块链上,即。它的代码存储在那里,并在那里有它的状态/内存。

交易是你在区块链上“做”的事情。当你想部署一个合约时,你将它(代码)放在一个交易对象中,然后在没有目标地址的情况下发送它(可以说是到区块链)。部署由矿工执行,合约被插入到区块链中。部署操作是一个事务。

执行以太币转账也是一种交易(基本上是调用一个简单的内部价值转账合约)。调用和执行复杂的“用户”——合约是一个交易,它也由矿工执行,结果/结果存储在区块链上(作为当前开采区块的一部分)。基本交易执行有成本(发送价值、部署),执行复杂的合同也有成本(cf Gas 等)。

(用两个词来解释这一切有点困难。每次我重新阅读课文,我都会添加新句子;)我希望这会有所帮助。)

于 2015-09-19T07:46:13.523 回答
0

以太坊闹钟可以在特定时间或区块安排合约函数调用。它目前正在开发主网和测试网。您也可以将其部署在本地网络上。

  • 一个便于调度功能调用未来指定区块的以太坊合约。
  • 可以安排函数调用针对任何合约执行
  • 调度可以由合约或以太坊账户持有人完成。
  • 完全包含在以太坊网络中。

例如,以下合同可能会延迟付款。这是来自以太坊闹钟存储库的示例

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 回答