假设,我需要从通常看起来像这样的对象tx获取数据:
{
ins: [
{
hash: <Buffer c4 37 9e 8c 55 93 98 f1 e6 68 83 c8 cf f4 45 90 59 0d 64 e8 c8 93 c3 e4 59 3d bf 6d 25 19 e0 dc>,
index: 1,
script: <Buffer >,
sequence: 4294967280,
witness: [Array]
}
],
outs: [
{
value: 1000000,
script: <Buffer a9 14 c6 95 36 cc 29 d8 7f 20 3e 0f 8f 4e 9e 1a 21 a1 47 14 d9 00 87>
},
{
value: 240536,
script: <Buffer 00 14 01 8d 87 11 fa ff 3d ed 55 e7 61 4f 87 80 c2 f6 08 a7 8d d3>
},
{
value: 0,
script: <Buffer 6a 17 68 74 74 70 73 3a 2f 2f 74 62 74 63 2e 62 69 74 61 70 73 2e 63 6f 6d>
}
]
}
一般来说,我需要做的是:
使用特殊库从脚本中提取地址参数。
检查此地址是否与我感兴趣的地址相对应。
获取此地址的值。
将地址和值都发送到下一步。
在某些情况下,库无法从脚本中解码地址并引发错误。这就是为什么我使用 try-catch 来跳过这些情况。
简单来说,我的代码如下所示:
for (i = 0; i < tx.outs.length; i++) {
try {
const address = bitcoin.address.fromOutputScript(tx.outs[i].script, network).toString();
if (!checkAddress(address)) {
return;
}
let txValue = tx.outs[i].value;
confirmTx(address, txValue);
} catch (e) {
logger.error(e)
}
}
想象一下,我在 outs 数组中有几个对象的 tx,其中一个对象存储了我要查找的地址。大多数情况下,一切正常,confirmTx 被按预期调用(仅针对该地址和值)。
但问题是,当使用其他地址和值调用confirmTx时会发生这种情况(并且该地址不应通过checkAddress(address))。
什么会导致问题?