1

我正在尝试使用Ripple-lib创建一个通过 XRPL 支付的简单示例。这个想法是向存储在数组中的不同帐户发送几笔付款。我已经按照预期以不同的方式使它工作,但是当使用“then”方法时(如文档推荐的那样)根本不起作用。

我是 Javascript 的新手,所以我对语言没有很好的掌握,也没有异步编码和承诺。使用“then”范例时,代码停止工作,并且在控制台中看不到任何输出。这是我目前正在使用的代码。在“SendXRP”函数内的评论中,我解释了这个问题。这怎么能重新安排?在这两种方式之间,什么是正确的编码方式?

'use strict';
const RippleAPI = require('ripple-lib').RippleAPI;

const sender = 'r*********************************';
const secret = 's****************************';
const destinations = ['r*********************************',
                      'r*********************************',
                      'r*********************************'];
const amount = 5;

// Instantiate Ripple API
const api = new RippleAPI({
  server: "wss://s.altnet.rippletest.net:51233"
});

run();


async function sendXRP(amount, fee, destination, memo) {

  // Update amount
  amount = (amount - fee).toString();

  // Build payment
  const payment = {
    source: {
      address: sender,
      maxAmount: {
        value: amount,
        currency: 'XRP'
      }
    },
    destination: {
      address: destination,
      amount: {
        value: amount,
        currency: 'XRP'
      }
    },
    memos: [
      {
          data: memo
      }
    ]
  };

  // Build instuctions
  const instructions = {
    maxLedgerVersionOffset: 5
  };

  console.log('Sending ' + amount + ' to ' + destination);

  // THIS KIND OF WORKS FOR NOW
  // Prepare the payment
  const preparedTX = await api.preparePayment(sender, payment, instructions);

  // Sign the payment
  const signedTX = api.sign(preparedTX.txJSON, secret);

  // Submit the payment
  const result = await api.submit(signedTX['signedTransaction']);

  // Return TX hash on successful TX
  if ('resultCode' in result && result['resultCode'] == 'tesSUCCESS') {
      return signedTX.id;
  } else {
      return null;
  }

  // THIS IS MORE SIMILAR TO HOW IT IS DONE IN THE DOCS! NOT WORKING!
  // ALSO, HOW DO I RETURN THE RESULT OF API.SIGN TO THE MAIN FUNCTION?
  // Prepare the payment
  // api.preparePayment(sender, payment, instructions).then(preparedTX => {
  //     // Sign the payment
  //     api.sign(preparedTX.txJSON, secret).then(signedTX => {
  //     // Submit the payment
  //     api.submit(signedTX['signedTransaction']);
  //     })
  // }).catch(console.error);
}

function run() {
// Connect to Ripple server
api.connect().then(() => {
  return api.getFee();
}).then(async fee => {

  for (var i in destinations) {
    var hash = await sendXRP(amount, Number(fee), destinations[i], 'memotext');
    console.log(hash);
  }

}).then(() => {
  return api.disconnect();
}).catch(console.error);
}
4

1 回答 1

1

会不会是部分交易发送失败?如果失败,sendXRP 的结果变量应该有 txresult,但是如果结果代码不是 tesSUCCESS,则返回 null,因此它不会返回结果信息。

const result = await api.submit(signedTX['signedTransaction']);

if ('resultCode' in result && result['resultCode'] == 'tesSUCCESS') {
  return signedTX.id;
} else {
  return null;
}

之前,当我尝试连续提交交易时,它会失败并返回错误代码tefPAST_SEQ

“交易的序号低于当前发送交易的账户序号。” 来自https://developers.ripple.com/tef-codes.html

我建议删除 if('resultCode' in result...) 块并检查交易结果。如果交易因 tefPAST_SEQ 错误而失败,我对此的解决方案是手动在指令中设置帐户顺序或在每次提交后添加 setTimeOut。

于 2019-04-02T14:18:50.280 回答