目录
utxo 模型是什么东西
UTXO (未花费的交易输出 Unspent Transaction Output )Transaction act发音简写为X。
合约:例如XX给XX,XXGAS,是一个基本的模型
交易:将具体信息填入合约形成交易,例如A给B,10GAS
输入:之前某一笔交易的输出,包含txid(哪一笔交易的输出)、n(该交易的第几个输出)
输出:每笔交易产生n个输出,包含address(收币对象),assetid(货币类型),value(数额)
找零:输出存在返回自身的utxo
注意:每个UTXO都为一次性使用,每次交易后产生的输出都为新货币形式,输入货币被销毁。
交易流程
- 初始资产设置:A 10GAS;B 0GAS
- 交易:A给B,3GAS
- A 取出10GAS 交给合约,合约根据交易产生新的utxo,3GAS 和7GAS
- 输出:3GAS给B,7GAS给A -- 存在返回自己的utxo,找零
- 合约内原输入的10GAS销毁
- 结果资产分配:A 7GAS; B 3GAS
- 第二次交易:B给 A,1GAS
- 输入:B的3GA为上一笔交易的第一个输出
- B取出3GAS交给合约,合约根据交易产生新的utxo,1GAS和2GAS
- 输出:2GAS给B ,1GAS给A (找零)
- 销毁合约内的原有3GAS
问:二次交易后,用户A有多少钱?
计算方式:多少笔交易给了A钱并且A没有花费掉;即,查询所有交易输出地址为A并且没有输入指向的输出为未花费的交易输出(utxo)
# output对应一个transaction,判断该transaction是否存在input的txid内 output: { address,# 给谁 assetid,# 什么资产 value,# 多少 } input: { txid,# 该输入是哪一笔交易的输出 n,# 该输入是上述交易的第几个输出 } if transaction in input‘s txid: # 判断交易id是否存在输入表中 if output’S n in input's n: # 若交易id存在,则判断输出id是否存在输入表中 '''查询 address 为 A 的 output,并且,该 output 不存在 input 信息内 ''' outid = select outid from output where address='A' #获取所有指向A的输出 txid = select txid from tx where outid ='outid' #获取所有指向A的输出的对应交易 inputn = select n from input where txid= 'txid' #在输入表中查询对应交易的输出id utxo = outid not in inputn # 同交易的输出id不在输入表的n内即为utxo
什么是UTXO
https://v.qq.com/x/page/l0544i8lnwm.html
https://github.com/NewEconoLab/Docs/blob/master/study/startlesson/utxo.md
UTXO 是 Unspent Transaction Output 的缩写,Transaction act发音简写为X。
UTXO是中本聪最早在比特币中采用的一个具体的技术方案。
在比特币的设计中,并没有账户概念,那么如何回答如下问题:
用户A 有多少钱?
UTXO的答案是,看多少笔交易给了A钱并且A没有花费掉,A就有多少钱。
以NEO为例,每一笔交易有N个输出,每个输出都包括如下信息
{ address,//给谁 assetid,//什么资产 value,//多少 }
找出所有 交易输出地址为A的并且没有花费的交易,即可回答用户A有多少钱。
花费与未花费
花费是什么概念,每一个Transaction Output都犹如现实中的一张纸币,他只有两种状态,属于你或者不属于你。
未花费就是该张纸币属于你,已花费就是该张纸币不属于你。
以NEO为例,每一笔交易有N个输入,每个输入都包括如下信息
{ txid,//该输入是哪一笔交易的输出 n,//该输入是上述交易的第几个输出 }
txid 和 n 可以对应到相应的交易输出上,只要有txid 和 n 对应到交易输出上。 该交易输出称为已花费交易输出。
没有txid 和 n 对应到的交易输出,称为未花费交易输出。
聪明如你一定发现了,是不是如纸币一样只能花一次呢,是的。
你一定也发现了,现实中经常有找零的问题,UTXO的花费是否也存在找零问题呢,是的
找零
每个UTXO 都是一次性的,当用户A给用户B转账时,一定会碰到想转的数额和自己的UTXO数值不匹配的问题。
此时采用的方法是,用多个输出,有一些输出还给自己,例如:
输入(from x GAS:10) 输出[0](to y gas:2) 输出[1](to x gas:8)
这个机制称为找零,其实并不只是找零,如果用兜里一把零碎utxo去转账,反而是找回一个整的。
输入输出都是由客户端自行决定的。 可以在一笔交易中产生大量的输出找给自己。