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交易在每一个区块中都会存在,它的总额包括了系统针对矿工打包交易过程的奖励以及其他转账方提供的手续费,如下图:

因此,创建一个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分支 上,希望大家一起提建议!

node.js与比特币(typescript实现)的更多相关文章

  1. 使用vscode写typescript(node.js环境)起手式

    动机 一直想把typescript在服务端开发中用起来,主要原因有: javascript很灵活,但记忆力不好的话,的确会让你头疼,看着一月前自己写的代码,一脸茫然. 类型检查有利有敝,但在团队开发中 ...

  2. 老吕教程--01后端Node.js框架搭建(安装调试KOA2)

    今天开始从零搭建后端框架,后端框架基于Koa2,通过Typescript语言编写. 在写后端框架之前,自己也了解过Express,感觉Koa2更加灵活,由于有多年后端研发经验,所以采用Koa2,简单敏 ...

  3. 创建Node.js TypeScript后端项目

    1.安装Node.js扩展,支持TypeScript语法 npm install -g typescript   npm install -g typings 2.创建项目目录project_fold ...

  4. 【Visual Studio Code 】使用Visual Studio Code + Node.js搭建TypeScript开发环境

    1.准备工作 Node.js Node.js - Official Site Visual Studio Code Visual Studio Code - Official Site 安装Node. ...

  5. 使用Visual Studio Code + Node.js搭建TypeScript开发环境

    Visual Studio Code搭建Typescript开发环境 —— 相关文章: http://www.cnblogs.com/sunjie9606/p/5945540.html [注意:这里仅 ...

  6. Node.js && Angular && TypeScript 环境安装与更新

    安装 Node.js 下载并安装Node.js Angular 执行命令 npm install -g @angular/cli 参考资料: angular quickstart TypeScript ...

  7. Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Nest.js 6.0.0 正式版发布了.Nest 是构建高效.可扩展的 Node.js Web 应用程序的框架.它使用现代的 JavaSc ...

  8. Node.js + TypeScript + ESM +HotReload ( TypeScript 类型的 Node.js 项目从 CommJS 转为 ESM 的步骤)

    当前 Node.js 版本:v16.14.0 当前 TypeScript 版本:^4.6.3 步骤 安装必要的依赖 yarn add -D typescript ts-node @tsconfig/n ...

  9. A chatroom for all! Part 1 - Introduction to Node.js(转发)

    项目组用到了 Node.js,发现下面这篇文章不错.转发一下.原文地址:<原文>. ------------------------------------------- A chatro ...

随机推荐

  1. MyEclipse完善提示配置

    MyEclipse完善提示配置 一般的,MyEclipse中的提示以"."后进行提示,不是很完善.现在,修改提示配置,让提示更完善! 具体操作如下: 1.打开MyEclipse,单 ...

  2. dojo中获取表格中某一行的某个值

    dojo中经常出现对表格中的某行进行操作,如单击某行修改.删除等.那怎样获取某行的唯一标示呢? 如查询表格中的某列有个userId,并且这个是唯一的,那么可以通过它来访问这一列 具体操作代码如下: v ...

  3. hibernate(二)主键生成策略

    hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...

  4. [QNAP crontab 定時執行程式

    注意要自動執行的 sh 檔不要放在 /root 裡, 不然韌體更新後檔案會不見, 要放在個人帳號的資料夾,例如 /share/homes/帳號/ QNAP 的 crontab 放在 /etc/conf ...

  5. linux shell 基本规范

    开头指定脚本解释器 #!/bin/bash 或 #!/bin/sh 开头加版权信息 #Date: 2017-8-01 22:50 #Author: yang qiang wei #Mail: xxx@ ...

  6. [HAOI2012]高速公路

    题面在这里 题意 维护区间加操作+询问区间任选两不同点途中线段权值之和的期望 sol 一道假的期望题... 因为所有事件的发生概率都相同,所以答案就是所有方案的权值总和/总方案数 因为区间加法自然想到 ...

  7. [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  8. 环境变量配置为jdk8,显示的java版本为jdk7

    经查找发现是jdk版本的问题,我系统环境变量配置的是jdk7,可是这个war包需要在jdk8的环境下运行.于是我就手动将环境变量的jdk7换成jdk8,结果发现依然还是会出现以上问题.于是我打开cmd ...

  9. MyBatis映射器元素

     映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具,映射器中主要有增删改查四大元素,来满足不同场景的需要: 下面是主要元素的介绍:         select:查询语句 ...

  10. Android Foreground Service (前台服务)

    一.如何保活后台服务 在Android Services (后台服务) 里面,我们了解了Android四大组件之一的Service,知道如何使用后台服务进行来完成一些特定的任务.但是后台服务在系统内存 ...