首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【科普】Blockchain&Bitcoin

因为公众号里有朋友问起,加上最近又有柯达推出“柯达币”的新闻,所以在此稍微介绍下这两年很火的Blockchain & Bitcoin。

A blockchain, originally block chain, is a continuously growing list of records, called blocks, which are linked and secured using cryptography.

以上是来自维基百科对blockchain的定义,其实很简单,就是由一些block串起来的chain。不过这些block组成chain的过程是基于了密码学技术。而block的内容并没有规定具体是什么,但通常是transaction records。

上面的定义其实就是blockchain的本质,但金融圈的人可能更喜欢的定义是“a distributed ledger”,也就是分布式记账本。

传统的记账是集中式的,由一个被信任的实体来管理维护,比如银行的账本。而当这个被信任的实体没能很好的履行其任务时,比如记录出错,甚至账本丢失,那样就会导致一些账户的钱减少丢失。

而分布式记账技术则避免了上面的缺点,不再需要一个被信任的实体来维护账本,账本的管理维护由分布的节点(即运行分布式记账软件的机器)来完成。每个节点都保有一份完整的记录,即blockchain,该记录的更新由所有参与的节点共同完成。

blockchain最重要的特点是完整可溯,每个block一旦被添加到chain上,block里面的数据就会永久保留下来,无法变更,这样就保证了记录不会被篡改,也不会被丢失。

这样的优点使得blockchain适合用来实现数字货币,而Bitcoin正是blockchain的首次应用,也就是说bitcoin是用blockchain技术实现的。

在Bitcoin里,所有的货币交易转账都用blockchain记录下来了,截止到2018年1月,当前约有50万个block,block里面则是bitcoin诞生到现在的所有transactions。所有的block,以及每个block里面的transactions都可以在blockchain.info这个网站上查看到,所以bitcoin本质其实就是一份公开的账本,这份账本目前大小已经达到150多GB,由分布在全球的数万个节点node维护,这些节点在各自的机器上都保存了这150GB的账本数据。新的交易发生时,会广播到所有节点,节点将交易收集到一个block里面,每个block的大小限制为1MB,差不多达到这个限制后,某个节点会propose添加新的block到chain上,经过P2P网络协议的分布式协商,让所有节点都接受这个新的block,一旦这个新的block添加完成,这也就意味着block里面的transactions被执行了,而整个账本的大小自然又增加了。

回到blockchain的本质定义,a chain of blocks, which are linked and secured using cryptography,也就是密码学如何保证了chain上的block内容是无法变更,永久保存的。

这里用到的cryptography技术主要就是hash。hash是一种数学函数y=h(x),其中x可以是任意大小的,但y却是固定长度的。以Bitcoin中使用的hash函数SHA-256为例,不管输入x为多大,输出y都是256bit。

hash函数最重要的一个特点是collision resistance,也就是说很难找到两个不一样的a, b,使得h(a) = h(b)。这里说的很难并非是不可能,而是说要花费很长时间穷尽所有可能才能找到,或者说找到这样的collision的概率是negligible。以SHA-256为例,因为输出y有2^256种可能,所以至少需要尝试2^128次才可能找到造成冲突的不一样的a, b。尝试这么多次可能需要计算机运行上千年时间才能找到,所以在实际中可以看做是安全的。

而当一种hash函数被发现有更快的方法找到collision的时候,这种hash函数也就不安全了,比如MD5也是一种hash函数,但由于王小云的努力,已经可以在几个小时内找到这样的a, b,使得md5(a) = md5(b)。不过这仅仅是意味着找到冲突而已,并不能通过h(x)来找到x,因为hash函数是单向不可逆的。

hash函数这样的特点使得其适合用来标识检验文件,对于文件x,任何微小的改动x',都会使得h(x)!=h(x'),而且不管改动多微小,hash值却会变化非常大,也就是说不能通过hash值变化的多少来推断x的变动多少。

而blockchain里的blocks就是通过hash函数来保证其内容的完整性的,chain上每个block开始的部分都是上一个block内容的hash值,所以一旦一个block的内容被更改,那么其hash值就会发生变化,所以下一个block内容也必须更改才能使得其记录的hash值与上一个block的变更保持一致,这样会导致后续的所有block都必须更改才能保证整个chain是有效的。

通过这样的hash函数将block串起来,使得blockchain具有immutable,或者说tamper-resistant的特点,因为一旦有任何篡改,都会导致后续的所有blocks失效,要想篡改成功就必须篡改后续所有的blocks,而且由于blockchain是分布式的,篡改一个节点的blockchain并没有用,除非能同时控制大多数的节点(而这在现实中基本也是不可能的)

blockchain上的blocks是通过指向前一个block的hash值链接在一起的,而每个block内部的records则同样是由hash值链接在一起的,不过block内部的records是按照二叉树形式串联的,而非挨个的排列,这样做是为了便于快速查找block里面的record。

上面说的基本上就是blockchain的本质内容了,a chain of blocks that are linked by hash pointers. 由于其完整可回溯,不可变更,所以可以用来做分布式记账 distributed ledger,这样就可以不必依赖被信任的第三方,只靠互相之间不信任的分布式节点就可以自动维持运行。

然后blockchain具体应用到Bitcoin的话,block里面的内容就是货币转账记录。要实现这种数字货币,还需要另一个密码学技术,即public key crypto.

public key (pk)是和private key (sk)配对的,public key是公开的,用来标识用户/账户,而private key仅对用户自己可见。用户在转账时是转到对方的public key上,而转账交易则需要用自己的private key来签名,这样其他人就可以用public key来检验这个签名是否有效。

Bitcoin中所有的货币流转都是有记录的,以下图为例进行说明:

第一行Alice获得了系统给予的25个比特币。前面说了bitcoin有50多万个block,每个新block添加的时候,系统都会给出固定数量的比特币,这是给负责找到这个新的block,并进行了更新的那个节点的,也就是所谓的比特币挖矿节点。其中细节太多,这里就先不说了。

这25个比特币是转到了Alice的public key上的(实际上使用的是叫address,是Alice的public key的hash值),当Alice要使用这25块钱来向Bob支付17块的时候(图中的第二行),需要使用Alice的private key来签发这个转账交易。

每个交易都有input,其实也就是某个交易的output,这里第二行交易的input就是第一行的output,第一行交易没有input,因为那是系统给出的。也就是说Alice需要指定自己public key收到的output,来作为转账给别人的input。

由于Alice只向Bob付了17块,但整个input需全部用完,所以剩下的8块转到Alice的public key上。每个用户都可以生成无数多个public key,且这些public key都只对应该用户自己才知道的唯一private key。这样的话,就可以通过不断变更public key来自己转账给自己,以达到匿名的效果。

只要用户知道private key,就可以使用其对应的所有public key上收到的output转账,当然前提是那个output是unspent的,即没有被作为input使用过。

回到图中的第三行交易,Bob收到了Alice的17块,然后他就可以使用第二行中的output,加上Bob用private key来签名,就可以向Carol支付8块,同样剩下的9块则可以转到Bob拥有的任何public key上。

最后一行则是Alice向David支付6块,使用的是第二行中Alice向Bob转账后剩下的8块作为input,然后output则是david的public key,以及又是剩下的2块到Alice的任一public key下。

因为用户的public key (pk)是和private key (sk)配对的,所以只有拥有private key来签名,才能使用public key上收到的转账,一旦private key丢失,那么所有人都将无法使用那部分钱,即使是系统也无法回收。举例来说,假如David遗失了自己的private key,那么Alice转给David的6块将永远是unspent状态,所有人都无法使用那6块钱。

以上就是Blockchain & Bitcoin的核心内容了,省略了比特币挖矿过程,以及所谓的blockchain 2.0,也就是Ethereum,smart contract,以及ICO之类的应用,这些以后有机会再介绍吧。如果有兴趣想深入了解的话,推荐去上Coursera上的Bitcoin and Cryptocurrency Technologies这门课。

或者可以在TEA茶阅上查看下面这篇经济学人的专题报道,中文版是我这两天整理翻译出来的。文章很长,音频有近半个小时,所以可能需要花很久的时间才能看完。虽然是两年前的报道,但内容并没有过时。不过我觉得这篇文章有个缺点就是有些地方混淆了blockchain & bitcoin 这两者的关系,这或许是因为在早期的时候只有bitcoin是在被使用的一个blockchain,人们想的更多的是利用这个现成的平台,而今天,则出现了五花八门各种类型的数字货币和区块链应用,也就是说现在有很多不同的blockchain存在,人们可以不必非要用bitcoin的blockchain来做blockchain可以做的事情,创造新的blockchain来做各种可能的事情,这或许就是未来的发展。

而bitcoin作为第一个出现的blockchain,其历史地位只会随着更多blockchain的出现而抬高。虽然bitcoin设计是作为一种数字货币,但它的本质是一个blockchain,一份公开的无法变更的账本(当前已达150GB),所以如果你想在这个世界永久地留下点什么的话,或许可以考虑往bitcoin的blockchain上铭刻下自己的信息,比如你的爱情告白,这或许能比钻石更加久远,因为这是全世界都可以永久可看的。

往bitcoin的blockchain上留信息的方法就是转账时的output那里不指定收款方的public key,而是直接使用op_return,随后就可以添加一定数量的文字。这样的话,没人能收到这笔钱,相当于这笔钱被销毁了,不过重要的是你的文字被作为这次transaction的一部分永久的进入了blockchain。有钱人如果想烧钱的话,可以买下大量比特币(比如1000个bitcoin),然后全部op_return销毁掉,顺带附上一句“我是有钱人”,这样全世界都会永久地知道你确实是有钱人,因为你曾经拥有1000*14120=1.4千万美元,然后还直接烧掉了,虽然可能没有直接烧美钞有快感,但关键是能让全世界都永久知道,而这或许会有另一种不一样的快感。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180113G05YQY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券