2015-08-30 2 views
1

Я пытаюсь отправить транзакцию и выполнить ее на определенном блоке. Это оказывается возможным в соответствии с API JS:Как заставить транзакцию выполнить в определенном будущем блоке #? (Ethereum, 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

Функция web3.eth.sendTransaction(transactionObject [,callback]) имеет действительно только 2 параметра.

(см. Здесь: https://github.com/ethereum/web3.js/blob/master/lib/web3/methods/eth.js#L177, необязательный обратный вызов неявный).

Текст в вики, вероятно, является копией & за ошибки. Я исправил это сейчас, поэтому, пожалуйста, не винитесь за то, что вы не прочитали документацию :)

NB. Я не понимаю, почему вы хотите настроить таргетинг на специальный блок для включения транзакций. Вы никогда не можете быть уверены, что ваша транзакция включена в блок, так как это определяется шахтером, а не подателем транзакции. Если вам нравится иметь отложенное исполнение, вам нужно будет использовать Контракт.


Редактировать: добавить ответ на комментарий ниже, поскольку это общая информация.

«Сделка» и «Контракт» - это две вещи на разных уровнях. Говоря о «Контракте», один говорит в общем (в контексте Эфириума) код приложения, определяющий логику, которая выполняется полностью или полностью (обеспечивается самой Блокчейной, поэтому нет необходимости в третьей доверенной стороне, таким образом, Smart Contract "). Этот код «живет» на Blockchain, т.е. его код хранится там и имеет свое состояние/память.

Сделка - это то, что вы «делаете» на Blockchain. Когда вы хотите развернуть Контракт, вы поместите его (код) в объект транзакции и отправьте его без адреса назначения (так сказать, в Blockchain). Развертывание выполняется шахтером, и контракт вставляется в Blockchain. Операция развертывания - это транзакция.

Выполнение переноса эфира также является транзакцией (в основном, с использованием простого договора о передаче внутреннего значения). Вызов и выполнение сложного «Пользователь» -Контракт - это транзакция, которая также выполняется шахтером, а результат/результат сохраняется в Blockchain (как часть текущего Mined Block). Выполнение основных транзакций имеет затраты (стоимость отправки, развертывание), выполнение сложных контрактов (cf Gas и т. Д.).

(. Это немного сложно объяснить все это все в 2-х словах Каждый раз, когда я перечитываю текст, добавить новые предложения;) Я надеюсь, что это помогает)

+0

Таким образом, новый контракт гарантированно будет добываться, но сделок нет? – fivedogit

+0

Кроме того, причина включения в конкретный блок заключается в том, что я надеялся создать cron-подобного демона. Вместо часов, минут и, он будет использовать блок #. – fivedogit

+0

(я ответил выше) – Imifos

0

Ethereum Alarm Clock может планировать функцию контракта. звонки в определенное время или в блок.

  • Договор Эфириума, что облегчает функции планирования требует определенного блока в будущем.
  • Функциональные вызовы могут быть запланированы к исполнению по любому контракту
  • Планирование может осуществляться по контрактам или держателям счетов в эфире.
  • Полностью содержится в сети ethereum.

Следующий контракт, к примеру, может отсрочить платеж:

contract DelayedPayment { 
    SchedulerInterface constant scheduler = SchedulerInterface(0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b); 

    uint lockedUntil; 
    address recipient; 

    function DelayedPayment(address _recipient, uint numBlocks) { 
     // set the time that the funds are locked up 
     lockedUntil = block.number + numBlocks; 
     recipient = _recipient; 

     uint[3] memory uintArgs = [ 
      200000,  // the amount of gas that will be sent with the txn. 
      0,   // the amount of ether (in wei) that will be sent with the txn 
      lockedUntil, // the first block number on which the transaction can be executed. 
     ]; 
     scheduler.scheduleTransaction.value(2 ether)(
      address(this), // The address that the transaction will be sent to. 
      "",    // The call data that will be sent with the transaction. 
      255,   // The number of blocks this will be executable. 
      uintArgs,  // The tree args defined above 
     ) 
    } 

    function() { 
     if (this.balance > 0) { 
      payout(); 
     } 
    } 

    funtion payout() public returns (bool) { 
     if (now < lockedUntil) return false; 

     return recipient.call.value(this.balance)(); 
    } 
} 

Текущая версия размещенного по адресу: 0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b. Проверьте alarm clock documentation for more details.