比特币是如何运行的:UTXO模型是什么?

作为比较,我们先回顾下现实的银行系统:

  1. 首先我们需要使用个人信息(如身份证)给银行,银行给我们开户,开户时确立了我们对该账户的所有权。
  2. 进行支付的时候,银行对交易双方账户余额进行增减。

但比特币是一个去中心化的系统,没有这样的第三方,它是如何确定某个账户的比特币是属于谁的?这个问题等同于谁可以使用这个账户的比特币?

私钥:比特币资产的唯一权属凭证

在比特币的公共共享总账本中,记录了所有地址持有的余额,比特币的账户是用地址来表示。

当需要转账时,发送一笔类似的交易(为了理解做了简化):

"from""1ABzp1eP5QGefi2DMPTf...""to""3FRdnTq18LyNveWa1gQJcgp...""amount""1 btc"

当然比特币节点需要知道这笔交易是谁发起的,只有当由地址 1ABzp1eP5QGefi2DMPTf... 发起才是真正有效,因此要求发起人对交易信息进行签名,签名是用地址 1ABzp1eP5QGefi2DMPTf... 对应的私钥进行的。

当我们创建一个比特币地址(账户时),会首先生成一个随机数作为私钥,然后根据椭圆曲线算法(ECDSA)计算出公钥,然后在根据哈希运算及校验编码得到比特币地址。

比特币地址格式: 目前比特币有三种地址类型——

  1. P2PKH 地址,也叫 “传统地址(Legacy address)“,以数字 “1” 开头,长度为 26 个到 36 个字符, 如:1ABzp1eP5QGefi2DMPTfTL5SLmv7DivfNa
  2. P2SH 地址,以数字 “3” 开头, 如:3FRdnTq18LyNveWa1gQJcgp8qEnzijv5vR
  3. P2WPKH 地址,也叫 “Bech32 地址“,是一种高级的地址,以 “bc1” 开头

公钥及地址是公开的,私钥这是保密的,私钥推导地址的过程也是单向的,无法通过地址反推到公钥及私钥。

因此当我们持有某地址的私钥,就是持有该地址下的比特币,因此私钥必须妥善保管。

UTXO 模型

实际上,在比特币账本中,并不是的记录某个账户的余额是多少(和以太坊的账户余额模型不一样),比特币引入了一个“未花费的交易输出”(UTXO: Unspent Transaction Output)概念,一个 UTXO 代表 “一整块” 的可以使用的比特币。UTXO 作为交易的输入。

一个 UTXO 在交易时可以产生多个 UTXO ,比特币的交易是不断消费老 UTXO 产生新的 UTXO 的过程,当一个 UTXO 被作为交易的输入后,就不再是未花费的了(STXO),在某个时间点,所有 UTXO 的集合被称为 UTXO 集。比特币节点会追踪 UTXO 集,从而确定哪些代币未被花费,以及哪些人可以花费它们。从而避免双花(Double Spend)问题。

「思考:最初的 UTXO 从哪里来的呢?」

最初的 UTXO 都来自于区块挖掘奖励,这个称为 coinbase 交易,coinbase 交易可以没有 UTXO 输入,但是像所有正常输出一样,coinbase 交易的输出是新的 UTXO。

UTXO 其实是包含一定数量的比特币(以 “聪(satoshi)” 为单位)以及花费这些比特币时所需满足的条件(叫做 “锁定脚本(locking script)”),当我们要使用一个 UTXO 时,就是用私钥对 UTXO 进行解锁(签名),以便使用其中的比特币。

UTXO 是不可分割的最小的交易单元,如果我们想要花费的比特币数额低于 UTXO 的面值,那该怎么办呢?

我想给小李发送 0.5 BTC,我的 UTXO 面值为 1 BTC,由于必须通过交易花掉一整个UTXO的 BTC,因此我们需要创建另一个UTXO输出作为找零。

好比我们用一张 100 元纸币去买 10 块钱的东西,需要找零 90 块。这就是比特币交易的关键特性。

出于安全性和匿名性的考虑,应该总是使用新比特币地址,来进行找零。

交易


这个是我在区块链浏览器中截下的一个交易(链接),我们可以看到这个交易有一个 UXTO 输入,两个 UXTO 输出。

交易的 “Fee” 显示的数值,其实是 UTXO 总输入和 UTXO 总输出之间的差值。

交易结构中没有指明交易费,交易费总是动态计算得出的,在创建交易时,我们要确保输出总是略低于输入,以便让矿工计算交易费是多少。

交易费由矿工收取,用来其补偿保护网络安全,也是其重要的收入来源之一,如果没有交易费,有些矿工会阻止其在网络中广播。

钱包

在日常使用过程中,通常是借助钱包软件来完成交易的,钱包本身不保存资产,资产是记录在比特币网络账本中的(通常称为保存在链上)。

钱包为了显示你的比特币 “余额”,钱包软件必须在比特币区块链上查询所有由你的私钥控制的 UTXO,然后将这些 UTXO 的值相加,并显示最终余额。

如果想花费 1 BTC,钱包会检查你所有的 UTXO 加起来是否有 1 BTC。如果有的话,钱包就会使用这些 UTXO 作为输入来创建另一笔交易。

钱包实际是一个管理私钥(生成、存储、签名)的工具。

支持比特币的钱包很多,例如:imTokenTrust WalletMath WalletLedger(硬件钱包)、Trezor(硬件钱包)等。

我们应该尽量选择「开源、知名度大」的钱包,大额资产还可以使用硬件钱包。