En esta página
btcSignTransaction
Bitcoin: firmar una transacción
Solicita firmas para las entradas y salidas de una transacción preparada. El usuario revisa y confirma la solicitud en el dispositivo.
const result = await HardwareSDK.btcSignTransaction(connectId, deviceId, params);Parámetros
coin- obligatoriostringDetermina la definición de red especificada en bitcoin.json . Puede usarseshortcut,nameolabelde la moneda.inputs- obligatorioArrayde TxInputType ,outputs- obligatorioArrayde TxOutputType ,refTxs- obligatorioArrayde RefTransaction . Los refTxs de Zcash y Komodo también deben contenerexpiry,version_group_idyextra_datacomo campos.locktime- opcionalnumber,version- opcionalnumberversión de la transacción,expiry- opcionalnumber, solo para Decred y Zcash,versionGroupId- opcionalnumbersolo para Zcash, nVersionGroupId cuando overwintered está activado,overwintered- opcionalbooleansolo para Zcashtimestamp- opcionalnumbersolo para Capricoin, marca de tiempo de la transacción,branchId- opcionalnumber, solo para Zcash, BRANCH_ID cuando overwintered está activado
Construir los parámetros de transacción
Construir una entrada
const buildHardwareInput = async (
input: TxInput,
path: string,
): Promise<Messages.TxInputType> => {
const { getHDPath, getScriptType } = await CoreSDKLoader();
const addressN = getHDPath(path);
const scriptType = getScriptType(addressN);
const utxo = input.utxo as UTXO;
return {
prev_index: utxo.vout,
prev_hash: utxo.txid,
amount: utxo.value.integerValue().toString(),
address_n: addressN,
script_type: scriptType,
};
};Construir una salida
const buildHardwareOutput = async (
output: TxOutput,
): Promise<Messages.TxOutputType> => {
const { isCharge, bip44Path } = output.payload || {};
if (isCharge && bip44Path) {
const { getHDPath, getOutputScriptType } = await CoreSDKLoader();
const addressN = getHDPath(bip44Path);
const scriptType = getOutputScriptType(addressN);
return {
script_type: scriptType,
address_n: addressN,
amount: output.value.integerValue().toString(),
};
}
return {
script_type: 'PAYTOADDRESS',
address: output.address,
amount: output.value.integerValue().toString(),
};
};Construir una transacción anterior
import * as BitcoinJS from 'bitcoinjs-lib';
const buildPrevTx = (rawTx: string): RefTransaction => {
const tx = BitcoinJS.Transaction.fromHex(rawTx);
return {
hash: tx.getId(),
version: tx.version,
inputs: tx.ins.map((i) => ({
prev_hash: Buffer.from(i.hash).reverse().toString('hex'),
prev_index: i.index,
script_sig: Buffer.from(i.script).toString('hex'),
sequence: i.sequence,
})),
bin_outputs: tx.outs.map((o) => ({
amount: o.value.toString(),
script_pubkey: Buffer.from(o.script).toString('hex'),
})),
lock_time: tx.locktime,
};
};Ejemplo
Los fragmentos siguientes ilustran las estructuras de los parámetros. Usa UTXO reales que se puedan gastar, importes coincidentes y transacciones anteriores completas; los datos estáticos no constituyen una transacción lista para difundir.
PAYTOADDRESS
import type { BTCSignTransactionParams } from "@onekeyfe/hd-core";
// Load the actual previous transactions for the UTXOs below.
declare const refTxs: BTCSignTransactionParams["refTxs"];
declare const previousOutputAmount: string;
HardwareSDK.btcSignTransaction(connectId, deviceId, {
inputs: [
{
address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
prev_index: 0,
prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
amount: previousOutputAmount,
}
],
outputs: [
{
address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
amount: '3181747',
script_type: 'PAYTOADDRESS',
}, {
address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
amount: '200000',
script_type: 'PAYTOADDRESS',
}
],
refTxs,
coin: 'btc'
});SPENDP2SHWITNESS
import type { BTCSignTransactionParams } from "@onekeyfe/hd-core";
// Load the actual previous transactions for the UTXOs below.
declare const refTxs: BTCSignTransactionParams["refTxs"];
declare const previousOutputAmount: string;
HardwareSDK.btcSignTransaction(connectId, deviceId, {
inputs: [
{
address_n: [(49 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
prev_index: 0,
prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
amount: '3382047',
script_type: 'SPENDP2SHWITNESS',
}
],
outputs: [
{
address_n: [(49 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
amount: '3181747',
script_type: 'PAYTOP2SHWITNESS',
}, {
address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
amount: '200000',
script_type: 'PAYTOADDRESS',
}
],
refTxs,
coin: 'btc'
});PAYTOADDRESS con refTxs (datos de transacción proporcionados por un backend personalizado)
HardwareSDK.btcSignTransaction(connectId, deviceId, {
inputs: [
{
address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
prev_index: 0,
prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
amount: '3431747',
}
],
outputs: [
{
address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
amount: '3181747',
script_type: 'PAYTOADDRESS',
}, {
address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
amount: '200000',
script_type: 'PAYTOADDRESS',
}
],
refTxs: [
{
hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
inputs: [
{
prev_hash: '448946a44f1ef514601ccf9b22cc3e638c69ea3900b67b87517ea673eb0293dc',
prev_index: 0,
script_sig: '47304402202872cb8459eed053dcec0f353c7e293611fe77615862bfadb4d35a5d8807a4cf022015057aa0aaf72ab342b5f8939f86f193ad87b539931911a72e77148a1233e022012103f66bbe3c721f119bb4b8a1e6c1832b98f2cf625d9f59242008411dd92aab8d94',
sequence: 4294967295,
}
],
bin_outputs: [
{
amount: 3431747,
script_pubkey: '76a91441352a84436847a7b660d5e76518f6ebb718dedc88ac',
},
{
amount: 10000,
script_pubkey: '76a9141403b451c79d34e6a7f6e36806683308085467ac88ac',
}
],
lock_time: 0,
version: 1,
},
],
coin: 'btc'
});Resultado
{
success: true,
payload: {
signatures: Array<string>, // Array of signer signatures
serializedTx: string, // serialized transaction
txid?: string, // transaction ID, if returned; signing does not broadcast
}
}Error
{
success: false,
payload: {
error: string, // error message
code?: string | number // error code
}
}Última actualización el