• Home
  • ビットコインをNode.jsで複数アドレスから送信する

ビットコインをNode.jsで複数アドレスから送信する

bitcoin-lib を用いて複数アドレスから単一のアドレスに送信処理を行う。

確認環境:BitcoinCore(0.18.0)、npm(6.9.0)、nvm(v8.12.0)

環境設定(environment)

使用するライブラリや変数を定義する。

require('dotenv').config();

const BN = require('bignumber.js');
BN.set({ ROUNDING_MODE: BN.ROUND_DOWN, DECIMAL_PLACES: 8});

const bitcore = require('bitcore-lib');
const explorers = require('bitcore-explorers');
const insight = new explorers.Insight();
const Client = require('bitcoin-core');

const client = new Client({
host: process.env.BITCOIN_NODE_HOST,
network: process.env.BITCOIN_NODE_NETWORK,
username: process.env.BITCOIN_NODE_USER,
password: process.env.BITCOIN_NODE_PASS,
port: process.env.BITCOIN_NODE_PORT
});

const from_address1 = "";
const from_address2 = "";
const to_address = "";
let amount = 0.0001;
let fee = 0.00002;

const private_keys = [
new bitcore.PrivateKey(''),
new bitcore.PrivateKey(''),
];
const public_keys = private_keys.map(bitcore.PublicKey);

amount = new BN(amount).multipliedBy(1e8).toNumber();
fee = new BN(fee).multipliedBy(1e8).toNumber();

let unspent_utxos1;
let unspent_utxos2;

UTXOの取得(getUnspentUtxos)

insight を用いてUTXOを取得する。

function getUtxos(from_address) {
return new Promise((resolve, reject) => {
insight.getUnspentUtxos(from_address, function (err, utxos) {

if (err) {
reject(err);
}

try {

const object = utxos.map((utxo) => {
return utxo.toObject();
});

resolve(object);

} catch (e) {
reject(e);
}

});
});
};

トランザクションの生成・署名(Transaction)

bitcore-lib を用いてトランザクションの生成・署名を行う。

Promise.resolve(1).then(rows => {
return getUtxos(from_address1);
}).then(rows => {
unspent_utxos1 = rows;
return getUtxos(from_address2);
}).then(rows => {
unspent_utxos2 = rows;

const utxos1 = unspent_utxos1.map((unspent_utxo) => {return bitcore.Transaction.UnspentOutput(unspent_utxo)});
const utxos2 = unspent_utxos2.map((unspent_utxo) => {return bitcore.Transaction.UnspentOutput(unspent_utxo)});
const utxos = utxos1.concat(utxos2);

const transaction = new bitcore.Transaction();
transaction.from(utxos, public_keys);
transaction.to(to_address, amount);
transaction.change(from_address1);
transaction.change(from_address2);
transaction.fee(fee);
transaction.sign(private_keys);

const signature = transaction.serialize();
console.log(signature);

});

※送信元アドレスのいずれかが UTXO を必ず所有していること。
※送信元アドレスと秘密鍵が合致していないものが含まれていても動作するが、合致しているもののみがトランザクションの生成対象となる。

送信処理(send)

出来た署名を bitcoin-core を用いて送信する。

const signature = process.argv[2];

client.sendRawTransaction(signature).then(tx_hash => {
console.log(tx_hash);
});

複数の送信元アドレスの秘密鍵および UTXO を配列化することで、単一のトランザクションとして生成・署名することが可能となる。

ご相談・お見積もり

03-5207-2689