Creating Segwit Transactions with Bitcore-Node: A Troubleshooting Guide
As a Node.js developer, you have probably encountered issues when using the bitcore-lib
package to create and sign Bitcoin transactions. One of the most common challenges is trying to use the Segwit feature introduced in Bitcoin Core 26.1. In this article, we will explore how to overcome these limitations and successfully create Segwit transactions using the same NPM package.
Problem: Legacy Transactions
When creating legacy Bitcoin transactions with bitcore-lib
, it doesn’t seem to support Segwit by default. This is because the package relies on the older Bitcoin Core protocol, which does not natively support Segwit. However, some npm packages have been created to bridge this gap.
Solution: using bitcore-segwit'
To create and sign Segwit transactions using any npm package that supports it, you can use thebitcore-segwitpackage (available at [ This package provides an easy way to work with Segwit-compatible Bitcoin nodes and wallets.
Step by Step Guide
Here is a step by step guide on how to create and sign Segwit transactions usingbitcore-liband
bitcore-segwit:
- Install the required packages: Run the following command in your terminal:
npm install bitcore libseaweed
- Create a new transaction: Create a new transaction using the newTransaction
method provided by
libseaweed:
const { Transaction } = require('libseaweed');
const bitcoreLib = require('./bitcore-lib');
// Create a new wallet (e.g. from a private key)
let wallet;
try {
const privateKey = 'your_private_key_here';
wallet = await bitcoreLib.createWallet(privateKey);
} catch (error) {
console.error(error);
}
// Create a new transaction
const tx = new transaction(
wallet.address,
[new BitcoindAddress('1.2.3.4:1234'), // sender address]
);
// Set Segwit token for transaction
tx.setSegwits([
{ type: 'publicKey', privateKey: privateKey },
]);
// Sign transaction with new private key (or use existing one)
const signature = await bitcoreLib.signTransaction(tx, 'your_new_private_key_here');
In this example:
- We create a wallet using bitcore-lib
and store it in the
walletvariable.
- We create a new transaction usinglibseaweed
.
- We set the Segwit tag for the transaction by adding an object with two properties:type = ‘publicKey’
and
privateKey = privateKey. This tells
libseaweed` to use your private key as the public key in the transaction.
- Finally, we sign the transaction using the new private key.
Confirm the transaction
To check if the Segwit transaction was successfully created, you can use the following code:
const { Transaction } = require('libseaweed');
const bitcoreLib = require('./bitcore-lib');
// Create a new wallet (eg from private key)
let the wallet;
try {
const privateKey = 'your_private_key_here';
wallet = await bitcoreLib.createWallet(privateKey);
} catch (error) {
console.error(error);
}
// Create a new transaction
const tx = new transaction(
wallet.address,
[new BitcoindAddress('1.2.3.4:1234'), // sender address]
);
// Set Segwit token for transaction
tx.setSegwits([
{ type: 'publicKey', privateKey: privateKey },
]);
// Sign transaction with new private key (or use existing one)
const signature = await bitcoreLib.signTransaction(tx, 'your_new_private_key_here');
// Verify transaction
const verificationTx = new transaction(
wallet.address,
tx.hash,
);
await verificationTx.verify(signature);
If transaction was successfully verified, you should see a message indicating that transaction was verified.