手动计算UTXO
const TX_TYPE_IN = 1;
const TX_TYPE_OUT = 2;
export const CreateUtxos = async (address: string, data: any) => {
let mapData = new Map();
let temp = new Map();
for (const iter of data) {
mapData.set(iter.hash, iter);
// console.log(iter.hash);
let type = TX_TYPE_IN;
for (const input of iter.inputs) {
if (input.coin.coinbase) continue;
if (address == input.coin.address) {
type = TX_TYPE_OUT;
}
}
let out = -1;
let balance = 0;
for (const output of iter.outputs) {
out++;
if (address == output.address) {
balance = output.value;
break;
}
}
temp.set(iter.hash, { type, out, balance, spentTxid: null, spentHeight: 0 });
}
for (const [key, value] of mapData) {
for (const input of value.inputs) {
if (input.coinbase) continue;
if (temp.has(input.prevout.hash)) {
const pre = temp.get(input.prevout.hash);
const local = temp.get(key);
if (pre.spentHeight <= 0 && (pre.type != local.type || local.type == TX_TYPE_OUT)) {
pre.spentTxid = value.hash;
pre.spentHeight = value.height;
}
}
}
}
let balance = 0;
let unspentList: Array<any> = [];
for (const [key, value] of temp) {
if (value.spentHeight === 0) {
balance += value.balance;
// console.info(key, value.out);
unspentList.push(value);
} /*else {
temp.delete(key);
}*/
}
// return {balance, unspentList: Array.from(temp.values())}
return { balance, unspentList };
}
我最擅长从零开始创造世界,所以从来不怕失败,它最多也就让我一无所有。