精通比特币-012
1. 冷钱包/热钱包
比特币钱包按照私钥的存储方式,可以分为冷钱包、热钱包两种。
冷钱包是指网络不能拿访问到你私钥的钱包。
冷钱包往往依靠“冷”设备确保比特币私钥的安全,比如不联网的电脑、手机、写着私钥地址的小本本等。
冷钱包避免了被黑客盗取私钥的风险,但是可能棉铃物理安全的风险,比如电脑丢失顺怀等。
热钱包是指互联网能够访问你私钥的钱包,热钱包往往是在线钱包的形式。
使用热钱包时,最后在不同平台设置不同密码,且开启二次认证,以确保自己的资产安全。
无论是使用冷钱包还是热钱包,只要其他人知道你的比特币私钥,就能转走的你的比特币。
谁掌握私钥,谁才是比特币真正的主人。
2. 比特币交易本质 – UTXO(Unspent Transaction Output)
UTXO 代表 Unspent Transaction Output。(Transaction 简称为 TX)
现在的银行、信用卡、证券交易系统以及互联网第三方支付系统,其核心都是基于账户(accout based)的设计,由关系数据库支撑。
数据库要确保两点:
1. 第一是你要确保业务规则得到遵守,张三的余额充足。
2. 第二是确保事务性,也就是原子性、一致性、隔离性、持久性(ACID)。
如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图:
但在比特币中,这个过程是通过UTXO实现的,图示如下:
比特币的区块链账本记录的是一笔又一笔的交易。
每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。
一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其产生的输出,就是“未花费过的及交易输出”,也就是UTXO。
比特币交易遵守几个规则:
除了coinbase交易之外,所有的资金来源都必须来自前面某一个或者几个交易的UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。
任何一笔及交易的交易输入总量必须等于交易输出总量,等式两边必须配平。
上图第一个交易#1001号交易是coinbase交易。比特币是矿工挖出来的。当一个矿工费尽九牛二虎之力找到一个合格的区块之后,它就获得一个特权,能够创造一个coinbase经济交易,在其中放入一笔新钱,并且在交易输出的收款人地址一栏,堂堂正正的写上自己的地址。这个coinbase交易随着张三挖出来的区块被各个节点接受,经过留个确认以后永远的烙印在历史中。
过了几天,张三打算付2.5个比特币给李四,张三就发起一#2001号交易,这个交易的资金来源项写着“#1001(1)”,也就是#1001号交易——张三挖出矿的那个coinbase交易——的第一项UTXO。然后在本交易的交易输出UTXO项中,把2.5个比特币的收款人地址设为李四的地址。
请注意,这一笔交易必须将前面产生那一项12.5个比特币的输出项全部消耗,而由于张三只打算付给李四2.5个比特币,为了要消耗剩下的10比特币,他只好把剩余的那10个比特币支付给自己,这样才能符合输入与输出配平的规则。
再过几天,张三和李四打算AA制合起来给王五付5枚比特币。那么张三或李四发起#3001号交易,在交易输入部分,有两个资金来源,分别是#2001(1)和#2001(2),代表第#2001号交易的第(1)和第(2)项 UTXO。然后在这个交易的输出部分里如法炮制,给王五5比特币,把张三剩下的7.5比特币发还给自己。以后王五若要再花他这5比特币,就必须在他的交易里注明资金的来源是#3001(1)。
所以,其实并没有什么比特币,只有UTXO。当我们说张三拥有10枚比特币的时候,实际上是说,当前区块链账本中,有若干笔交易的UTXO项收款人写的是张三的地址,而这些UTX 项的数额总和是10。因为在比特币系统里,一个人可以拥有的地址资源,可谓取之不尽用之不竭。要知道自己的一大堆地址里一共收了多少UTXO,人是算不过来的,需要由比特币钱包代为跟踪计算。
如果采用基于账户的方案,需要一个数据库。这个数据库能够让你很方便的茶道张三、李四的账户余额。
而UTXO方案当然也需要一个数据,这个数据库记录着当前系统里每一笔“没有花出去的交易输出”,也就是比特币。当节点接受到一笔交易的时候,它需要去UTXO数据库里查,看看这笔交易所引用的UTXO是否存在,它的收款人(拥有者)是不是当前新交易的付款者。而交易结束后,数据库需要做相应的更新。
首先要明确,无论是账户数据还是UTXO数据库,必须是分散的,每节点一个克隆,一定不能使中心化的。如果比特币系统由一个中心数据库,不管你有多少节点,每一笔交易都要跑去中心数据库验证一下、然后在执行“转账”的事务操作,那就完全谈不上“去中心化”,比特币就毫无价值了,不如老老实实用支付宝。
长期来看,账户数据库会无限膨胀,而UTXO数据库体积会小很多。
比特币是一个匿名体系,他的账户就是“地址”。每一个比特币用户可以拥有几乎无限多的地址,在比特币系统来看,它完全不知道两个地址背后对应的是不是同一个人。
在版本控制方面的考虑,svn是中心化数据库保持一份账本,这和区块链的设计自然是相违背的,git是去中心化的数据库,但会保存太多冗余数据,对于分布式性能要大打折扣。
UTXO数据库是抛弃了历史包袱的git,只存储最后一个版本。简易实用。
UTXO具有天然的匿名效果,一个账户所对应的未花费交易是难以发现的。
在性能方面,由于UTXO是独立的数据记录,那么久存在极大的并行性可以提升区块链交易验证速度。
3. 多重签名
能够实现多个用户对同一文件进行签名的数字签名方案称作多重数字签名方案。
多种签名就是多个用户对同一个消息进行数字签名。
多重签名,可以简单的理解为一个数字资产的多个签名。签名标定的是数字资产所属和权限,多重签名预示着数字资产可由多人支配和管理。在加密货币领域,如果要动用一个加密货币地址的资金,通常需要该地址的所有人使用他的私钥(由用户专属保护)进行签名。那么多重签名,就是动用这笔资金需要多个私钥签名,通常这笔资金或数字资产会保存在一个多重签名的地址或账号里(就比特币而言,多重签名地址通常以3开头)。
采用单项散列函数,很容易实现多重签名:
1. A对文件进行散列签名。
2. B对文件进行散列签名。
3. B将他的签名交给A。
4. A把文件、和她的签名和B的签名发给Carol.
5. Carol验证A和B的签名。
A和B能同时或顺序地完成第(1)步和第(2)步;在第(5)步中Carol可以只验证其中一人的签名而不用另一人的签名。
关于Multisig(多重签名),从原理角度上讲,多重签名本身并不复杂,简单来说,一句话就够了:“用m把钥匙生成一个多重签名的地址,需要其中的n把钥匙才能花费这个地址上的比特币,m>=n,这就是n/m的多重签名”。
多重签名应用场景思考:
1. 电子商务。
2. 财产分割。
3. 资金监管。
多重签名的设计,让各种业务去中心化充满无限可能。