Обработка умных контрактных транзакций - PullRequest
0 голосов
/ 20 мая 2018

Я кодировал свой маленький проект, но столкнулся с проблемой.вот мой код:

app.get('/thu', (req, res) => {
  thu(function(err, output){
    if(err){
      res.json({"err": ""+err, "output": output});
      return;
    }
    res.send("ket qua: ", output);
  });
});
var thu = function(callback){
  web3.eth.getTransactionCount(senderAddress).then((txnCount) => {
    console.log("goi thu");
    var method = contract.methods.thu();
    var encodedABI = method.encodeABI();
    var thuTx = {
      from: senderAddress,
      to: contractAddress,
      nonce: web3.utils.toHex(txnCount),
      gasLimit: web3.utils.toHex(GAS_LIMIT),
      gasPrice: web3.utils.toHex(GAS_PRICE),
      data: encodedABI,
    };
    sendTxn(thuTx, callback);
  }).catch((err) => {
    console.log("web3 err", err);
    callback(err, null);
  });
};

function sendTxn(rawTx, callback) {
  var privateKeyBuffer = new Buffer(privateKey, 'hex');
  var transaction = new tx(rawTx);
  transaction.sign(privateKeyBuffer);
  var serializedTx = transaction.serialize().toString('hex');
  web3.eth.sendSignedTransaction(
  '0x' + serializedTx, function(err, txnHash) {
    if(err) {
      console.log("txn err", err);
      callback(err, null);
    } else {
      console.log("txn result", txnHash);
    }
  }).catch((err) => {
    callback(err, null);
  });
}

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

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Проблемы решены.проблема в том, что я забыл поставить обратный вызов (...) в else {...}.

0 голосов
/ 20 мая 2018

sendSignedTransaction возвращает комбинированный источник событий Promise.

Эфириум как блокчейн имеет разные уровни завершенности и поэтому должен возвращать несколько «этапов» действия.Чтобы справиться с требованием, мы возвращаем «promiEvent» для таких функций, как web3.eth.sendTransaction или контрактные методы.Этот «promiEvent» представляет собой обещание в сочетании с источником событий, позволяющим действовать на разных этапах действия в цепочке блоков, например транзакции.

Вы можете разместить файл console.log для каждого события, чтобы увидетьчто происходит, или если вы получаете сообщение об ошибке.

web3.eth.sendSignedTransaction('0x' + serializedTx)
    .once('transactionHash', hash => console.log(`Hash: ${hash}`)
    .once('receipt', receipt => console.log(`Receipt: ${receipt}`)
    .on('confirmation', (confNumber, receipt) => console.log(confNumber))
    .on('error', error => console.error(error))
    .then(receipt => {
        // will be fired once the receipt its mined
    });
...