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. sql语句中的left join,right join,inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) ...

  2. PyCharm运行报编码错误

    运行报如下错误: SyntaxError: Non-ASCII character '\xe8' in file /home/ubuntu/code/201803091253-text.py on l ...

  3. C#图解教程 第二十四章 反射和特性

    反射和特性 元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性 Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特 ...

  4. CodeForces 940E

    题意略. 这个题目我开始题意理解得有点问题.本题的实质是在这个数列中选择一些数字,使得选出的这些数字之和最大,用dp来解. 我们先要明确:当我选择数列长度为2 * c时,不如把这个长度为2 * c的劈 ...

  5. 如何通过java反射的方式对java私有方法进行单元测试

    待测试的私有方法: import org.testng.Assert;import org.testng.annotations.BeforeClass;import org.testng.annot ...

  6. AC自动机模板2(【CJOJ1435】)

    题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模 ...

  7. [Luogu2991][USACO10OPEN]水滑梯Water Slides

    题面戳我 题面描述 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建一个水上乐园.当然,它最大的亮点就是新奇巨大的水上冲浪. 超级轨道包含 E (1 <= E &l ...

  8. Idea工具开发 SpringBoot整合JSP(毕设亲测可用)

    因为,临近毕业了,自己虽然也学了很多框架.但是,都是在别人搭建好的基础上进行项目开发.但是springboot的官方文档上明确指出不提倡使用jsp进行前端开发,但是在校期间只学了jsp作为前端页面.所 ...

  9. Spring9:Autowire(自动装配)机制

    为什么Spring要支持Autowire(自动装配) 先写几个类,首先定义一个Animal接口表示动物: public interface Animal { public void eat(); } ...

  10. spring中aop的注解实现方式简单实例

    上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...