白话比特币区块链

中本聪方案
2008年,世间出了个中本聪(Satoshi Nakamoto)。
这人发了一篇论文“比特币:对等电子现金系统”。提了一个全套的网上交易方案:比特币和区块链。
这是首次亮相出现的,一个去中心化的、点对点网上自由交易的方案。用户无实名登记。整个世界就只有一个总账本。总账本网上公开,上面只存交易记录。用精心安排的密码验证及脚本方案,保护这种网上的公开交易,致政府及黑客皆无法下手干预。这是在金融货币体系掀起了一场概念上的革命。许多人有的感觉,人类将进入区块链新时代。
稍微具体,这方案简单说来就是:
[平面网] 大家都上网做交易,点对点互相平等做买卖转款。没有中心管理中心控制,完全自由无政府的没人管。
[比特币] 每笔转款交易记成(交易号,输入,输出)格式。交易体现了一笔价值的归属权利,这价值权利称为比特币。每笔交易都广播到网上,任何人都能看到。
[脚本验证] 交易在输入部分中,指明钱的来源:先前是哪一个交易号在其输出部分转出的款。并且放上输入脚本,也叫解锁脚本。交易在输出部分中,指明钱转给谁:放上接受方的所谓比特币地址。并且放上输出脚本,也叫锁定脚本。
交易输入部分的解锁脚本,可以解开来源交易输出部分的锁定脚本,以证明自己有权拥有来源交易输出里的这笔款项。
交易输出部分的锁定脚本,指定只有接受人提供的解锁脚本,可以解开锁定,从而确证接受人的正确无误。
每笔交易就这么前后勾着:输入勾着来源交易号的输出。而输出,又有可能被后续交易勾连作为输入。每个交易都可在总账详细查到。那些还没有被下一个交易勾连的输出,被称作交易的未花费输出,简记为UTXO(unspent transaction output)。没有被下一个交易勾连做输入,表明这笔钱还放在那里,还没被转移,没被花销。UTXO的数值,是可以用来消费的比特币数量。
[区块链] 网上保持一个公开的公共账本。一大堆交易([交易号,输入,输出])被收集,打包成一大块,叫区块。区块编号,放进公共账本,叫记账。区块有区块头,区块头里放前一个区块的编号。这样全体区块是链在一起的。这叫做区块链。区块链就是公共账本。公共账本任何人都可以查看。
很好懂吧。
那么谁来做这个区块打包和记入区块链(记账)呢?谁都可以。但你得通过竞争得到记账权。竞争就是计算个什么幸运数,耗运气,耗计算力。
[挖矿] 想记账的人,每人到网上去收集一大堆交易,打成包块,去算这个幸运数,谁算对了谁有权把他打的包块记入区块链公共账本。然后广播全网。其他竞争者一看,知道有人记账成功,放弃当前包块,重新收集新的交易来打包块,同时立刻开始算下一个幸运数,争取下一个记账权。
为什么网上这么多人竞争记账?是记账者能得比特币。只有记账,才产生新的比特币数值。这新的比特币数值,奖给记账人。这是比特币唯一的新币发行方式。竞争记账被说成是挖矿。记账人叫矿工。挖矿费力,但是可以挖出价值矿石。所以这是很合适的比喻。
用这种方式,中本聪设计算法难度,以及可以自动调节算法难度,能够保持矿工每10分钟产生一个新区块。这样使得比特币成为一种缩通货币。货币不会滥发,不造成通胀。
这就是整个方案。很清楚吧。
总结一下中本聪方案。
下列结构组成比特币交易:
一个去中心化点对点网络(比特币协议)
去中心化交易验证系统(交易脚本)
公共交易账簿(区块链)
分散的数学和确定性货币发行(分布式采矿)
中本聪方案中,区块存的是交易。各用户存的是自己的密钥。系统不存在中心,不存个人信息及账户信息,没有结账流水、平衡清算。比特币公共账本能查的,只是区块里一笔一笔的交易。
一笔比特币交易上告诉全网的是,一个某数量比特币持有人,授权将持有权转给了新持有人。而新持有人能够再次授权,将该比特币持有权再转他人。如此这般链下去,是一个用交易号前后勾连的,比特币持有权的转移链条。区块链账本存的只是这些持有权的转移关系。
比特币用户
比特币用户没有账号,没有账户,没有个人信息登记管理。也没有记账流水,甚至没有个人账本。那他手上有什么呢?
他有自己的私钥,还可以有公钥,数字签名,钱包地址。
最重要的是私钥。私钥可以产生公钥。公钥可以产生钱包地址。私钥还可以对交易的明文加密,产生对该交易的数字签名。私钥需保密,不可示人。而公钥、数字签名、钱包地址,都是公开的。私钥丢失,无人能补。丢失私钥等于丢失比特币。
2013年,一位英国用户丢失了存有其私钥的硬盘,导致他钱包地址里7,500个比特币,当时价值750万美元,永远无法支付使用。
破解私钥的难度很高,它是比特币的主要安全机制。见文章讲专业估算,至2017年底,约有17%到23%,278万个到379万个的比特币因私钥丢失、密码遗忘,而永远无法再进入流通使用。
比特币用户使用比特币客户终端,也叫比特币钱包应用,这是个软件应用的程序平台。钱包应用保管用户的私钥。钱包协助用户,生成交易所需的公钥、数字签名和钱包地址。
用户持有这些密钥,通过钱包生成交易,生成解锁脚本和锁定脚本。钱包将交易公开,广播上网,要求矿工验证并打包入账。
交易能随便公开,靠的锁定脚本与解锁脚本。网上任何人都可以做脚本验证。脚本验证可以检测一个交易是否是一个合法交易。
密钥
那么,比特币使用何种密钥,又在怎样应用密钥?
前面提到,使用的密钥有私钥、公钥、钱包地址、数字签名,还有公钥哈希。
你任意取一32字节随机数,就是私钥。但真正私钥,为了安全,是用随机数发生器生成的。32字节私钥是一个256比特二进制数。下面是一个私钥实例,用64位十六进制表示:
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
私钥的选取空间是2的256次方,这数字空间极大。用十进制表示,大约是10的77次方,而可见宇宙被估计只含了10的80次方个原子。
私钥经过一种椭圆曲线算法(SECP256K1),得到公钥。这算法不可逆。即,知道私钥可算出公钥。知道公钥无法反向算出私钥。
或用公式表示简洁些。这些公式都很简单,这样你可以看得更清楚:
PrivK是私钥,PubK是公钥,有
PubK = SECP256K1(PrivK)
实际上,公钥是椭圆曲线上一个点的xy坐标值。公钥格式为:前缀04,接两个256比特xy坐标值。于是,公钥长度520比特,即,65字节,130个十六进制数字。公钥的一个实例:
04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
这520比特太长,耗占资源。而椭圆曲线上坐标点,y值可由x解方程得到。于是去掉y,只存x,得到所谓公钥压缩格式,它以02或03做前缀,长度264比特(66个十六进制数字)。压缩公钥的一个实例:
03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
公钥经两次不同哈希计算(算法SHA256及算法RIPEMD160),得到所谓公钥哈希。
这里简单介绍哈希。哈希算法把一串任意长明文信息数据,生成一段面目全非固定长字母数字。哈希算法不可逆。即,由固定长字母数字的哈希值,不能反生出原来任意长的明文信息数据。用公式表示:
M2 = H(M1)
M1为任意长明文,H为哈希算法,M2为固定长字母数字串。M2称为明文M1的消息摘要。
哈希函数的特点是,当对明文M1做任何改变成为M1'时,H(M1)不等于H(M1')。这保证了哈希值的不可篡改性。
用公式表示公钥哈希,就是:
PubKHash = RIPEMD160(SHA256(PubK))
PubK为公钥,PubKHash为公钥哈希。算出来的公钥哈希20字节,160比特。
公钥哈希经编码,生出来所谓比特币地址,又称钱包地址。编码现在通常用的算法是Base58Check。钱包地址的公式表示:
BitcoinAdd = Base58Check(PubKHash)
PubKHash是公钥哈希。BitcoinAdd是比特币地址,即钱包地址。
编码算法可逆。即,由公钥哈希可以得到钱包地址,由钱包地址也可以得到公钥哈希。
下面是一个钱包地址的真实举例:
16rCmCmbuWDhPjWTrpQGaU3EPdZF7MTdUk
这是个著名钱包地址,不知何人所有。2018年1月4日(星期四)18:05 (UTC)时,该钱包地址上拥有179,203个比特币,时价约26.4亿美元。它是在这一时刻,世界上拥有比特币最多的钱包。
由私钥 -> 公钥 -> 公钥哈希 -> 钱包地址,这一串的生成,使得每个钱包地址都对应一个私钥。私钥保证持有人对钱包地址上比特币的所有权。
中本聪方案里,用户的对外信息,只有这个钱包地址。钱包地址把收款方身份抽象起来了。你的钱包地址如同你的邮箱地址。你使用邮箱地址收信发信,你使用钱包地址收款打款。邮箱每人可以开多个。用户的钱包应用可以为用户生成随意多个不同钱包地址。比特币官方网站甚至建议,每笔交易都使用一个新的钱包地址,以此完全遮蔽掉用户身份。
对某笔具体交易中的收款,接受人用自己私钥,对该交易生成数字签名。数字签名用来验证公钥,表明这个公钥是数字签名人的。数字签名不可逆。其他人没有私钥,生不出能验证公钥的数字签名。
数字签名生成用公式表示:
sig = Sig(PrivK, Hash(M))
Sig是签名算法。sig是生成的数字签名。PrivK是私钥。M是交易明文。

私钥、数字签名、公钥、公钥哈希、钱包地址的生成关系。红叉表明不可逆
交易
如前提到,每一交易有交易号,有一个输入部分,一个输出部分。
现在假设,张三想给李四转0.5个比特币。张三查到已经有一个111号交易,是以前王二把0.5个比特币转给了张三。王二在他的输出脚本中放了张三的公钥哈希(PubKHash)。111号交易的记录可简化如下:
现在张三准备将这0.5比特币转给李四。为此,张三生成一个新交易,交易号为222。在222号交易的输入部分,张三指明本次交易的输入是111号交易的输出,输入部分还放进了张三的数字签名sig和公钥PubK。222号交易简化如下:
说明:此处是简化。张三不能给李四转0.5比特币,张三只能转小于0.5比特币,他需要留一点点比特币指明作为记账人的报酬付给矿工。
说明:这里的交易号111,222也是简化。实际的交易号,也叫交易索引,是一个32字节的哈希值。
下面是一个真实的交易索引号:
你可以用这个交易号到区块链总账本上,去查到这笔交易。此处为你做了链接。只需点击上面地址,即可得到交易号7957...在区块链账本上的信息。你可以实观看到这个交易的输入、输出,你还可以看到它的输入脚本(在Input Scripts栏中),和输出脚本(在Output Scripts栏中)。你会查到,这笔交易,其输入的来源交易号为:
713eef22615ffb7c2f8f813e79a0d1e170d05a99218e291c33daca258f284d52
在来源交易号713e...那里,钱包地址
18iWVBbk8tA9bbipS1evviVLP4eE5ga51P
接受了0.1个比特币。
而本次交易,即交易号7957...中,钱包地址18iW...上的这0.1比特币,转给了钱包地址
1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
而钱包地址1Cdi...上这个0.1比特币,被标注为Spent,即已花费,这表明,这个交易7957...后面还有交易,在后面的交易中(你还可以查下去),已经用了交易7957...做来源交易,这个钱包地址1Cdi...上的0.1比特币,已经又被转走了。因此,这个0.1比特币,不是UTXO(未被花费)。即,不可以交易号7957...作来源去建立新交易。
更准确来说,每一笔交易,包含一个或多个来源交易号,里面的比特币是UTXO的。又包含一个或多个钱包地址的输出。比特币来源输入的UTXO比特币,不允许被拆分发送。比如,某来源交易号中,有0.5个UTXO比特币输出。现想转给A的某钱包地址0.1个比特币。你不能从来源交易号输出中只转0.1个比特币出来。你的做法是,在你新生成交易中,输入是来源交易号输出的整个0.5UTXO比特币,为这0.5UTXO比特币做两个输出,一个输出的钱包地址是A的钱包地址,转0.1个比特币。另一个输出是给自己的钱包地址,转0.5-0.1-δ个比特币。称为“找零”。两者差值δ是一个很小数目,是留给矿工的记账小费。
比特币的脚本验证
比特币脚本是一种堆栈操作的虚拟机指令,只有几种指令。其语言是一种不完备图灵机符号序列。符号有两类:数据及操作。符号本身不具状态。说它不完备,是它刻意省去循环及转向。脚本执行从左向右,堆栈操作,后进先出。
上面的名词和说法都是吓人用的。你不要被吓住。它这脚本其实非常简单。
举例:执行运算2+3=5。它的脚本是符号序列:[2 3 OP_ADD]。对这个脚本的执行,从左到右,堆栈操作:
执行首先进到数据2。2进栈:
往右,执行进到3。3进栈:
往右,执行进到操作OP_ADD,这是加法操作。栈顶两元素取出执行加法,结果入栈:
我们来看抽象的简化例子。交易222的输入脚本里,B放入了自己的数字签名sig及公钥PubK,每次交易的数字签名都不同,但均从同一个私钥生成。于是B的输入脚本为序列:
[sig PubK]
交易222的源交易111中,A的输出脚本里放的是B的公钥哈希(PubKHash)和若干操作符。这个脚本的序列为:
[DUP HASH160 PubKHash EQUALVERIFY CHECKSIG]
验证时先取222的输入脚本(解锁脚本)序列,再取111的输出脚本(锁定脚本)序列,二者合一,得到合并序列,即:
[sig PubK] + [DUP HASH160 PubKHash EQUALVERIFY CHECKSIG] =
[sig PubK DUP HASH160 PubKHash EQUALVERIFY CHECKSIG]
现来执行这个脚本序列。
1)执行开始,首先进到sig(B的签名),sig进栈:
2)执行向右,进到PubK(B的公钥),PubK进栈:
3)执行右进,到操作符DUP,这是将栈顶元素做复制再进栈,相当于将B的公钥复制后进栈:
4)执行进到操作符HASH160,这是取出栈顶元素,即B的公钥,做哈希160后,进栈。对公钥做哈希160,结果是B的公钥哈希PubKHash,进栈后,为:
5)执行进到PubKHash,这个公钥哈希是交易111输出脚本中给的公钥哈希,此PubKHash进栈:
6)执行进到EQUALVERIFY,这是相等判断操作符。对栈顶两元素做相等判断。栈顶这两个PubKHash,一个是A在交易111输出中给出的B的公钥哈希,一个是B自己给的公钥哈希。这两个哈希必然相等。故,操作返回为真,抹去栈顶两元素:
7)执行进到CHECKSIG,这是对栈顶两元素执行签字验证操作。即,对B给出的公钥PubK,和B给出的sig(签名)做签字验证。这里公钥及签名均是B的私钥所生。故,验证必然为真。操作为栈顶两元素清空,操作返回为真。验证完毕。
现在我们来看前面那个实例,交易号795...的脚本验证。
这是用交易7957...的输入脚本,对应其来源交易713e...的输出脚本,两脚本合一,来做脚本验证。
网上你可查到,交易7957...的输入脚本,在交易7957...的Input Scripts(输入脚本)栏中,它标为ScriptSig(签字脚本):
PUSHDATA(73)[3046022100a59e516883459706ac2e6ed6a97ef9788942d3c96a0108f2699fa48d9a5725d1022100f9bb4434943e87901c0c96b5f3af4e7ba7b83e12c69b1edbfe6965f933fcd17d01] PUSHDATA(65)[04e5a0b4de6c09bd9d3f730ce56ff42657da3a7ec4798c0ace2459fb007236bc3249f70170509ed663da0300023a5de700998bfec49d4da4c66288a58374626c8d]
这实际是两个动作。第一个PUSHDATA(73)[3046......7d01]说得是将后面73字节的数据进栈,第二个PUSHDATA(65)[04e5......6c8d]说得是将后面63字节的数据进栈。操作符PUSHDATA括号中给出要进栈数据的字节数。
第一个73字节数据,是交易生成人给出的数字签名。第二个65字节数据,是交易生成人给出的公钥。我们可以把签字脚本简记为[PUSHDATA(73)sig PUSHDATA(65)PubK]
同样,交易7957...的来源交易为交易713e...,可以查到交易713e...的输出脚本(在Output Scripts栏中)为
DUP HASH160 PUSHDATA(20)[54a28c6ba2bebdb694fe487a87e3e8ed4eab1502] EQUALVERIFY CHECKSIG
这里这个54a2...,是所指定接受人的公钥哈希PubKHash。20个字节。上面两个脚本合到一起,得到:
[PUSHDATA(73)sig PUSHDATA(65)PubK DUP HASH160 PUSHDATA(20)PubKHash EQUALVERIFY CHECKSIG]
现在看到,这个脚本序列,与我们上边简化的例子一模一样。具体进栈操作验证和上面完全相同。故,进栈操作的验证从略。
梅克尔树及区块建立
矿工及挖矿
发展回顾
2009年1月,比特币网络被建立。许多开发者热情参与其中,开发团队实现了中本聪方案的参考设计。网上推出了第一个比特币客户端的“参考实现”,被称为“中本聪客户端”(satoshi client)。其功能来自中本聪编写的原始实现。客户端由开发团队作开源发布。
你可以从bitcoin.org下载标准客户端,即,中本聪客户端。它包括比特币所有功能,钱包功能、密钥管理、交易生成、对总账本(区块链)完整拷贝的交易确认引擎,形成点对点比特币网络中的一个完整网络节点。
根据操作系统不同,你将下载不同安装。对于Windows,是一个ZIP归档文件或.exe格式文件。对于Mac OS,是一个.dmg格式磁盘映像。Linux版本包括Ubuntu系统的PPA包,或是 tar.gz格式的压缩包。
中本聪本人利用客户端,生成区块链的第一个区块,称作创世区块(Genesis Block)。这使得区块链的链接记账及找矿创币得以正式开始启动。从区块链任何一个区块回溯查找,最终都达到创世区块。创世区块的区块索引号为:
0000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
你可以在区块链里找到它,并查看里面的内容。中本聪在创世区块里放了一条信息。它是当天英国泰晤士报头版文章的标题:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”(泰晤士报2009年1月3日,财政大臣站在第二次拯救银行的边缘)。这句话既注记了创世区块的产生时间,也隐含表达了对政府干预金融货币的情绪。这似乎也在暗示,一场未有过的世界性货币革命将要发生。
2010年比特币初起,比特币对美元初期比价约400:1。曾有客户用10,000比特币购买了两块价值25美元的比萨饼。
2013年,比特币对美元比价飙升至1:1200。2014年,对美元的比价跌回到1:750到1:1000。2017年重新上扬,2017年5月4日,比特币价格首次突破1500美元,市值达250亿美元以上。到年底的11月12月期间,1比特币涨至两万美金。
截止写这篇文章的今日,2018年3月4日上午1:34:37,比特币对美元比价为1:11,429.75。
中本聪本人于2011年4月神秘退出,在公众视野中完全消失。他把比特币区块链的代码开发维护留给了志愿者集团。中本聪应该只是一个化名。这个了不起设计发明人的真实身份,众说纷纭,至今仍是个迷。
意义
实名制传统的金融系统,通过中央控制,对客户个人资料及交易信息严格保密。但若国家政府基于不同原因,向金融机构索要数据,会使客户的隐私保护立刻丧失。这种干预,基于各种政权的特性,不排除滥用的可能。
而比特币系统,无中央管控,不实名注册,不对用户登记管理。用户的钱包地址用于接收比特币,与实名身份无任何联系。用户可以为每笔交易创建不同钱包地址,这可极大地保护隐私。各种不同地址间的复杂转款,外人无法辨清背后用户的关系。
又由于交易信息公开,交易合法性的签名验证,密钥使用的周密设计,区块的确认记账,区块的哈希勾链,矿工挖矿的难度控制,等等一系列特点,使得黑客不易对比特币发起攻击。
维基百科写道:“由于其采用密码技术来控制货币的生产和转移,而没有中央的发行机构,无法任意增发,交易在全球网络中运行,有特殊的隐秘性,加上不必经过第三方金融机构,因此得到越来越广泛的应用,也成了非法交易的媒介。用户利用个人电脑和智能手机中的加密钱包软件,无需任何银行、信用卡、在线支付公司等中介机构,可随时随地在网络上直接交换物品、服务。”
“比特币系统是基于完全透明的数学原理运作的。这项发明本身就具有开创性,已经在分布式计算,经济学和计量经济学领域产生了新的科学。”
InterTrader总经理Shai Heffetz说过一段话,指出政府威权机构对比特币可能产生敌视的原因:“许多的政府开始了解比特币对于传统的法定货币可以展现的真正威胁,...... 所有的国家都大量印制钞票并且扭曲数据以掩盖他们疯狂印钞票的事实。...... 比特币和其它的替代货币正在开始被认为是传统法币的可行性替代方案。因为比特币无法受到任何政府的操纵,全世界的掌权派开始忧虑并展开一波镇压。当被掩盖的通货膨脤事实渐渐被外界获知时,人们就会开始采信某一种独立的数字货币以取代价值遭到过度膨胀的传统法币。”
参考书
Andreas M. Antonopoulos:Mastering Bitcoin,中译本:精通比特币
Andreas M. Antonopoulos:Mastering Bitcoin (1st Edition & 2nd Edition)
03.2018.Berlin
 
 
 

没有评论:

发表评论