作为比较,我们先回顾下现实的银行系统:
-
首先我们需要使用个人信息(如身份证)给银行,银行给我们开户,开户时确立了我们对该账户的所有权。 -
进行支付的时候,银行对交易双方账户余额进行增减。
但比特币是一个去中心化的系统,没有这样的第三方,它是如何确定某个账户的比特币是属于谁的?这个问题等同于谁可以使用这个账户的比特币?
私钥:比特币资产的唯一权属凭证
在比特币的公共共享总账本中,记录了所有地址持有的余额,比特币的账户是用地址来表示。
当需要转账时,发送一笔类似的交易(为了理解做了简化):
"from":"1ABzp1eP5QGefi2DMPTf...""to":"3FRdnTq18LyNveWa1gQJcgp...""amount":"1 btc"
当然比特币节点需要知道这笔交易是谁发起的,只有当由地址 1ABzp1eP5QGefi2DMPTf... 发起才是真正有效,因此要求发起人对交易信息进行签名,签名是用地址 1ABzp1eP5QGefi2DMPTf... 对应的私钥进行的。
当我们创建一个比特币地址(账户时),会首先生成一个随机数作为私钥,然后根据椭圆曲线算法(ECDSA)计算出公钥,然后在根据哈希运算及校验编码得到比特币地址。
❝
比特币地址格式: 目前比特币有三种地址类型——
P2PKH 地址,也叫 “ 传统地址(Legacy address)“,以数字 “1” 开头,长度为 26 个到 36 个字符, 如:1ABzp1eP5QGefi2DMPTfTL5SLmv7DivfNaP2SH 地址,以数字 “3” 开头, 如: 3FRdnTq18LyNveWa1gQJcgp8qEnzijv5vRP2WPKH 地址,也叫 “ 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 作为输入来创建另一笔交易。
钱包实际是一个管理私钥(生成、存储、签名)的工具。
支持比特币的钱包很多,例如:imToken、Trust Wallet、Math Wallet、Ledger(硬件钱包)、Trezor(硬件钱包)等。
我们应该尽量选择「开源、知名度大」的钱包,大额资产还可以使用硬件钱包。