- Home
- ビットコインをNode.jsでUTXOを指定して送信
ビットコインをNode.jsでUTXOを指定して送信
Bitcoin アドレスに存在する UTXO を確認、UTXO 単位での送信処理を検証
● UTXO 単位で送信(utxo_send.js)
最小限の UTXO を指定し送信処理を行うことで、トランザクションに含まれるデータ量が軽減される。
これにより不要な fee の発生を防ぐことが可能となる。
const from_address = process.argv[2]; const private_key = process.argv[3]; const to_address = process.argv[4]; let amount = process.argv[5]; let fee = 0.00001; getUtxos(from_address).then(rows => { if(rows && Array.isArray(rows) && rows.length > 0) { let utxos = []; let send_amount = 0; rows.forEach(function(row) { if(send_amount <= amount) { utxos.push(row); send_amount = new BN(send_amount).plus(row["amount"]).toNumber(); } }); amount = new BN(amount).multipliedBy(1e8).toNumber(); fee = new BN(fee).multipliedBy(1e8).toNumber(); const transaction = new bitcore.Transaction(); transaction.from(utxos); transaction.to(to_address, amount); transaction.change(from_address); transaction.fee(fee); transaction.sign(private_key); const signature = transaction.serialize(); return send(signature); } else { throw new Error("not utxos"); } }).then(rows => { return console.log(rows); }).catch(err => { return console.log(err.message); }); function getUtxos(address) { return new Promise((resolve, reject) => { insight.getUnspentUtxos(address, function (err, utxos) { if (err) { reject(err); } try { const object = utxos.map((utxo) => { return utxo.toObject(); }); resolve(object); } catch (e) { reject(e); } }); }); }; function send(signature) { return new Promise((resolve, reject) => { client.sendRawTransaction(signature).then(tx_hash => { resolve(tx_hash); }).catch(err => { reject(err); }); }); };
● UTXO 単位でのケース別送信処理
単一UTXOからの送信処理
複数 UTXO からの送信処理
例外ケースでの送信処理
送信処理を行う際に発生した例外(エラー)ケース
※ Dust amount の発生条件
ダストリミットは、1つの入力と1つの出力を持ち、未公開の出力を P2PKH でロック解除する仮想トランザクションをモデルにしている。この取引の中継料の3倍がダストリミットとして設定されており、これに達しない場合 Dust amount が発生する。
transaction length(182) = 148 + output length(34)
dust limit(546) = 3 * transaction length(182)
ご相談・お見積もり
03-5207-2689