BTC中的utxo模型

BTC中引入了许多创新的概念与技术,区块链、PoW共识、RSA加密、萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封闭生态系统,但是在这个BTC生态中如果没有搭配区块链模式的转账模块,那么货币的流通属性也就无从谈起了。若要实现转账交易模块, “是否采用传统的账户模型实现交易;如何在区块链上存储交易信息,如何实现信息压缩;如何验证交易信息;系统的最大交易并发量”等问题确实值得思考。

BTC一一解决了这些,它放弃了传统的基于账户的交易模型,而是采用基于区块链存储的utxo(unspent transaction output)模型。笔者尝试分析了为什么不使用传统的账户模型:

  1. BTC的存储单元为区块链,区块链的数据结构本质上是单向链表,它并不是传统的关系型数据库,无法新建账户表
  2. 存储压力。如果采用传统的方式,则账户表会随着时间的推移不停地增大,为后续的表的分片与备份造成很大困难
  3. 易造成隐私泄露。账户表的信息会直观的暴露余额等敏感信息

utxo模型则很有技巧的避免了这些,在utxo模型下实现的每一笔交易,都不需要显式的提供转账地址和接收地址(utxo中没有账户,也不需要提供地址),只需提供这比交易的 交易输入交易输出 即可,而交易输入与交易输出又是什么?

交易输入指向一笔交易输出,而且 “这笔交易输出是可以供转账者消费的,因此这笔交易输出也被称作utxo(未花费交易输出)”,它包括“某一笔交易、指向这笔交易的某个可用交易输出的索引值和一个解锁脚本”。这个解锁脚本用来验证某笔可用的消费输出是否可以被提供解锁脚本的人所使用。

交易输出则是存储BTC“余额”的一个数据结构,它广义上包括两部分:BTC的数量和一个锁定脚本。 BTC的数量可以理解为余额,表示这笔交易产生的结果;而锁定脚本则是用某种算法锁定这个BTC余额,直到某人可以提供解锁该脚本的数据钥匙,这比数额BTC才会被这个人所消费。

从这个角度看,一笔交易会包含若干个交易输入,同时产生若干个交易输出。这些交易输入都会指向之前某笔交易的未被消费输出(utxo),并提供各自的解锁脚本以证明这些utxo里的BTC是属于转账方;同时将转账产生的所有交易输出用对应方的公钥进行加密(此处是为了更好的理解才解释为公钥加密,实质上是公钥哈希,即btc地址进行逆向base58编码的一段字符串),锁定这几笔交易输出,等待交易输入中的解锁脚本解锁。

aaarticlea/jpeg;base64,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" alt="utxo转账图示">

所以,BTC没有账户的概念,所有的“余额”都在区块链上,不过这些余额都已经被加密了,只有提供私钥和签名的人才可以使用对应的utxo的余额,因此这就是为什么BTC持有者必须保存好自己的私钥的原因。

UTXO的node.js实现

交易输入

export class Input {
private txId: string;
private outputIndex: number;
private unlockScript: string; public get $txId(): string {
return this.txId;
} public set $txId(value: string) {
this.txId = value;
} public get $outputIndex(): number {
return this.outputIndex;
} public set $outputIndex(value: number) {
this.outputIndex = value;
} public get $unlockScript(): string {
return this.unlockScript;
} public set $unlockScript(value: string) {
this.unlockScript = value;
} constructor(txId: string, index: number, unlockScript: string){
this.txId = txId;
this.outputIndex = index;
this.unlockScript = unlockScript;
} // 反序列化,进行类型转换
public static createInputsFromUnserialize(objs: Array<Input>){
let ins = [];
objs.forEach((obj)=>{
ins.push(new Input(obj.txId,obj.outputIndex,obj.unlockScript));
});
return ins;
} canUnlock (privateKey: string): boolean{
if(privateKey == this.unlockScript){
return true;
}else{
return false;
}
}
}

私有属性txId标识 “某个可用的utxo所属的交易”,是一串sha256编码的字符串;

outputIndex表示 “这个可用的utxo在对应交易的序号值”;

unlockScript则是解锁脚本,此处并未完全按照BTC的原型去实现,而是简单的验证使用者的私钥来实现鉴权,原理上仍遵从BTC的思想。

交易输出

import * as rsaConfig from '../../rsa.json';
export class Output {
private value: number;
// 锁定脚本,需要使用UTXO归属者用私钥进行签名通过
// 当解锁UTXO成功后,此UTXO变为下一个交易的交易输入,同时使用接收方的地址(公钥)锁定本次交易的交易输出,
// 等待接收方使用私钥签名使用该UTXO
// 因此,btc没有账户的概念,所有的“钱”由自己的公钥所加密保存,只有用自己的私钥才能使用这些钱(即解锁了UTXO的解锁脚本)
private lockScript: string; // 该属性仅仅在交易时使用,设置属性
private txId: string; // 该属性仅仅在交易时使用,设置属性
private index: number; public get $index(): number {
return this.index;
} public set $index(value: number) {
this.index = value;
} public get $txId(): string {
return this.txId;
} public set $txId(value: string) {
this.txId = value;
} public get $value(): number {
return this.value;
} public set $value(value: number) {
this.value = value;
} /* public get $lockScript(): string {
return this.lockScript;
} public set $lockScript(value: string) {
this.lockScript = value;
} */ constructor(value: number,publicKey: string){
this.value = value;
this.lockScript = publicKey;
} // 反序列化,进行类型转换
public static createOnputsFromUnserialize(objs: Array<Output>){
let outs = [];
objs.forEach((obj)=>{
outs.push(new Output(obj.value,obj.lockScript));
});
return outs;
} public canUnlock(privateKey: string): boolean{
if(privateKey == rsaConfig[this.lockScript]){
return true;
}else{
return false;
}
}
}

交易输出中的value属性标识当前utxo的余额,即BTC个数;

lockScript属性为锁定脚本,在我们的简易实现中就为接收方的公钥,并不是BTC中的逆波兰式,但大体原理相同,都需要提供私钥来进行解密。

一笔交易

一笔交易,包含了若干个交易输入和交易输出,同时也提供了一个txId唯一的标识这比交易。从结构上看是这样的:

export class Transaction {
private txId: string;
private inputTxs: Array<Input>;
private outputTxs: Array<Output>; constructor(txId: string, inputs: Array<Input>, outputs: Array<Output>){
this.txId = txId;
this.inputTxs = inputs;
this.outputTxs = outputs;
} public get $txId(): string {
return this.txId;
} public set $txId(value: string) {
this.txId = value;
} public get $inputTxs(): Array<Input> {
return this.inputTxs;
} public set $inputTxs(value: Array<Input>) {
this.inputTxs = value;
} public get $outputTxs(): Array<Output> {
return this.outputTxs;
} public set $outputTxs(value: Array<Output>) {
this.outputTxs = value;
}
/*
1.交易结构各字段序列化为字节数组
2.把字节数组拼接为支付串
3.对支付串计算两次SHA256 得到交易hash
*/
public setTxId(){
let sha256 = crypto.createHash('sha256');
sha256.update(JSON.stringify(this.inputTxs) + JSON.stringify(this.outputTxs) + Date.now(),'utf8');
this.txId = sha256.digest('hex');
} }

其中 txId的计算这里并没有严格按照BTC实现的那样进行计算,而是简单的进行对象序列化进行一次sha256。

coinbase交易

我们都知道得到比特币需要挖矿,其实挖矿也属于一种交易,不过是一种没有确定交易输入的一种交易,它也被称作coinbase交易。coinbase交易在每一个区块中都会存在,它的总额包括了系统针对矿工打包交易过程的奖励以及其他转账方提供的手续费,如下图:

node.js与比特币(typescript实现)-LMLPHP

因此,创建一个coinbase交易也很容易

    // coinbase交易用于给矿工奖励,input为空,output为矿工报酬
public static createCoinbaseTx(pubKey: string, info: string){
let input = new Input('',-1,info);
let output = new Output(AWARD, pubKey);
let tx = new Transaction('',[input],[output])
tx.setTxId();
return tx;
}

在我们的实现中,只需提供锁定utxo的公钥以及一串描述字符串即可,最后设置交易的txId,完成coinbase交易的创建。

也提供了识别coinbase交易的方法:

public static isCoinbaseTx(tx: Transaction){
if(tx.$inputTxs.length == 1 && tx.$inputTxs[0].$outputIndex == -1 && tx.$inputTxs[0].$txId == ''){
return true;
}else{
return false;
}
}

至此,coinbase交易就完成了,这是最简单的一种交易,并没有涉及到转账方,也就是交易输入。

转账交易

使用BTC就避免不了转账,转账事务在utxo模型的实现就是添加了一笔Transaction到某个区块而已。每一笔交易都需要交易输入和交易输出,因此在BTC中,转账的核心就是找到转账方的utxo进行消费,同时将指定数量的BTC划到指定的消费输出上,如果仍有剩余,则找零至自己的消费输出。

// 创建转账交易
public static createTransaction(from: string, fromPubkey: string, fromKey: string, to: string, toPubkey: string, coin: number){
let outputs = this.findUTXOToTransfer(fromKey, coin);
console.log(`UTXOToTransfer: ${JSON.stringify(outputs)}, from: ${from} to ${to} transfer ${coin}`)
let inputTx = [], sum = 0, outputTx = [];
outputs.forEach((o)=>{
sum += o.$value;
inputTx.push(new Input(o.$txId,o.$index,fromKey));
}); if(sum < coin){
throw Error(`余额不足,转账失败! from ${from} to ${to} transfer ${coin}btc, but only have ${sum}btc`);
} // 公钥锁住脚本
outputTx.push(new Output(coin,toPubkey));
if(sum > coin){
outputTx.push(new Output(sum-coin,fromPubkey));
}
let tx = new Transaction('',inputTx,outputTx);
tx.setTxId();
return tx;
}

创建一个交易,需要提供转账方的地址(公钥哈希)、转账方的公钥和私钥、接收方的地址、接收方的公钥以及转账的BTC数量。这笔交易由转账发发起,因此需要提供转账方的私钥进行解锁脚本。

首先,通过 findUTXOToTransfer 找到满足转账数量的可用的utxo,它需要提供转账方的私钥以及转账数量;

接下来根据获得的可用utxo,进行创建对应的交易输入;

然后用接收方的公钥加密交易输出,同时如果有余额的化找零给自己,用自己的公钥加密;

最后根据得到的交易输入与交易输出,创建一笔交易,计算txId,加入到区块中(我们的demo是在单机下进行模拟,并未实现多播),等待挖矿。

转账的核心在于 findUTXOToTransfer,在findUTXOToTransfer中,通过调用 getAllUnspentOutputTx拿到所有的可用的utxo,并筛选出满足给定数量BTC的utxo。

public static getAllUnspentOutputTx(secreteKey: string): Array<Transaction>{
let outputIndexHash: Object = this.getAllSpentOutput(secreteKey);
let unspentOutputsTx = [];
let keys = Object.keys(outputIndexHash);
let block = BlockDao.getSingletonInstance().getBlock(chain.$lastACKHash);
while(block && block instanceof Block){
block.$txs && block.$txs.forEach((tx)=>{
if(keys.includes(tx.$txId)){
tx.$outputTxs.forEach((output,i)=>{
// 过滤已消费的output
if(i == outputIndexHash[tx.$txId])
return; if(output.canUnlock(secreteKey)){
unspentOutputsTx.push(tx);
}
});
}else{
for(let i=0,len=tx.$outputTxs.length;i<len;i++){
let output = tx.$outputTxs[i];
if(output.canUnlock(secreteKey)){
unspentOutputsTx.push(tx);
break;
}
}
}
});
block = BlockDao.getSingletonInstance().getBlock(block.$prevHash);
}
return unspentOutputsTx;
}

在getAllUnspentOutputTx中,通过 getAllSpentOutput 遍历本地持久化的区块链,拿到所有的可供消费utxo,这些utxo并不仅仅属于转账方,因此需要在针对每个utxo尝试进行验证逻辑,即output.canUnlock(secreteKey)。验证通过则证明这是属于转账方的BTC,可以用于交易。

在getAllSpentOutput中,通过遍历每一个交易输入获取它指向前面交易的某个utxo来得到所有的utxo,当然对于coinbase交易我们无法找到他的交易输入,因此会进行过滤。

至此,utxo的转账流程已经完成,下面需要做的就是把这比交易加入到区块中了,这已不是本文的核心。

尾声

本文所讲的utxo示例是基于作者对BTC实现的基础上的简单实现,有不当之处还请读者指出。另外,本文的代码开源在 https://github.com/royalrover/ts-btcfeature/utxo分支 上,希望大家一起提建议!

05-06 01:48