• 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