Bitcoin

区块链的1.0时代:比特币 – 第5章 交易

5.1 简介 比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络中得以传播和通过验证,并最终添加入全球比特币交易总账簿(比特币区块链)。比特币交易的本质是数据结构,这些数据结构中含有比特币交易参与者价值转移的相关信息。比特币区块链是全球复式记账总账簿,每个比特币交易都是在比特币区块链上的一个公开记录。 在这一章,我们将会剖析比特币交易的多种形式、所包含的信息、如何被创建、如何被验证以及如何成为所有比特币交易永久记录的一部分。 5.2 比特币交易的生命周期 一笔比特币交易的生命周期起始于它被创建的那一刻,也就是诞生(origination)。 随后,比特币交易会被一个或者多个签名加密,这些签名标志着对该交易指向的比特币资金的使用许可。接下来,比特币交易被广播到比特币网络中。在比特币网络中,每一个节点(比特币交易参与者)验证、并将交易在网络中进行广播,直到这笔交易被网络中大多数节点接收。最终,比特币交易被一个挖矿节点验证,并被添加到区块链上一个记录着许多比特币交易的区块中。 一笔比特币交易一旦被记录到区块链上并被足够多的后续区块确认,便成为比特币总账簿的一部分,并被所有比特币交易参与者认可为有效交易。于是,被这笔交易分配到一个新所有者名下的比特币资金可以在新的交易中被使用——这使得所有权链得以延伸且再次开启一个新的比特币交易生命周期。 5.2.1 创建比特币交易 将一笔比特币交易理解成纸质支票或许有助于加深我们对它的理解。与支票相似,一笔比特币交易其实是一个有着货币转移目的的工具,这个工具只有在交易被执行时才会在金融体系中体现,而且交易发起人并不一定是签署该笔交易的人。 比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。比如,一个负责应付账款的柜员在处理应付票据时可能会需要CEO签名。相似地,这个负责应付账款的柜员可以创建比特币交易,然后让CEO对它进行数字签名,从而使之有效。一张支票是指定一个特定账户作为资金来源的,但是比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。 一旦一笔比特币交易被创建,它会被资金所有者(们)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的,它包含了转移这笔资金所需要的所有信息。最终,有效的比特币交易必须能接入比特币网络,从而使之能被传送,直至抵达下一个登记在公共总账薄(区块链)的挖矿节点。 5.2.2 将比特币交易传送至比特币网络 首先,一笔交易需要传递至比特币网络,才能被传播,也才能加入区块链中。本质上,一笔比特币交易只是300到400字节的数据,而且它们必须被发送到成千上万个比特币节点中的任意一个。只要发送者能使用多于一个比特币节点来确保这笔交易被传播,那么发送者并不需要信任用来传播该笔交易的单一节点。相应地,这些节点不需要信任发送者,也不用建立发送者的“身份档案”。由于这笔交易是经过签名且不含任何机密信息、私钥或密码,因此它可被任何潜在的便利网络公开地传播。信用卡交易包含敏感信息,而且依赖加密网络连接完成信息传输,但比特币交易可在任意网络环境下被发送。只要这笔交易可以到达能将它广播到比特币网络的比特币节点,这笔交易是如何被传输至第一个节点的并不重要。 比特币交易因此可以通过未加密网络(例如WiFi、蓝牙、NFC、ChirP、条形码或者复制粘贴至一个网页表格)被发送到比特币网络。在一些极端情况下,一笔比特币交易可以通过封包无线电、卫星或短波、扩频或跳频以避免被侦测或阻塞通信的方式进行传输。一笔比特币交易甚至可被编为文字信息中的表情符号并被发表到在线论坛,或被发送成一条短信或一条Skype聊天信息。因为比特币将金钱变成了一种数据结构,所以在本质上是不可能阻止任何人创建并执行比特币交易的。 5.2.3 比特币交易在比特币网络中的传播 一旦一笔比特币交易被发送到任意一个连接至比特币网络的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到一条表示交易成功的返回信息。如果这笔交易被验证为无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的信息。 比特币网络是一个点对点网络,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点是在启动点对点协议时被发现的)。整个比特币网络形成了一个松散地连接、且没有固定拓扑或任何结构的“蛛网”——这使得所有节点的地位都是同等的。比特币交易相关信息(包括交易和区块)被传播——从每一个节点到它连接的其他节点。一笔刚通过验证且并被传递到比特币网络中任意节点的交易会被发送到三到四个相邻节点,而每一个相邻节点又会将交易发送到三至四个与它们相邻的节点。以此类推,在几秒钟之内,一笔有效的交易就会像指数级扩散的波一样在网络中传播,直到所有连接到网络的节点都接收到它。 比特币网络被设计为能高效且灵活地传递交易和区块至所有节点的模式,因而比特币网络能抵御入侵。为了避免垃圾信息的滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。 一个异常交易所能到达的节点不会超过一个。”8.3 交易的独立校验“一节将详细介绍决定比特币交易是否有效的原则。 5.3...

Continue reading...

区块链的1.0时代:比特币 – 第4章 高级密钥和地址

4.5 高级密钥和地址 在以下部分中,我们将看到高级形式的密钥和地址,诸如加密私钥、脚本和多重签名地址,靓号地址,和纸钱包。 4.5.1 加密私钥(BIP0038) 私钥必须保密。私钥的机密性需求事实情况是,在实践中相当难以实现,因为该需求与同样重要的安全对象可用性相互矛盾。当你需要为了避免私钥丢失而存储备份时,会发现维护私钥私密性是一件相当困难的事情。通过密码加密内有私钥的钱包可能要安全一点,但那个钱包也需要备份。有时,例如用户因为要升级或重装钱包软件,而需要把密钥从一个钱包转移到另一个。私钥备份也可能需要存储在纸张上(参见“4.5.4 纸钱包”一节)或者外部存储介质里,比如U盘。但如果一旦备份文件失窃或丢失呢?这些矛盾的安全目标推进了便携、方便、可以被众多不同钱包和比特币客户端理解的加密私钥标准BIP0038的出台。 BIP0038提出了一个通用标准,使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。这个加密标准使用了AES,这个标准由NIST建立,并广泛应用于商业和军事应用的数据加密。 BIP0038加密方案是:输入一个比特币私钥,通常使用WIF编码过,base58chek字符串的前缀“5”。此外BIP0038加密方案需要一个长密码作为口令,通常由多个单词或一段复杂的数字字母字符串组成。BIP0038加密方案的结果是一个由base58check编码过的加密私钥,前缀为6P。如果你看到一个6P开头的的密钥,这就意味着该密钥是被加密过,并需要一个口令来转换(解码)该密钥回到可被用在任何钱包WIT格式的私钥(前缀为5)。许多钱包APP现在能够识别BIP0038加密过的私钥,会要求用户提供口令解码并导入密钥。第三方APP,诸如非常好用基于浏览器的Bit Address,可以被用来解码BIP00038的密钥。 最通常使用BIP0038加密的密钥用例是纸钱包——一张纸张上备份私钥。只要用户选择了强口令,使用BIP0038加密的私钥纸钱包就无比的安全,是一种很棒的线下比特币存储途径(也被称作“冷库”)。 在bitaddress.org上测试表4-10中加密密钥,看看你如何得到输入口令的加密密钥。 表4-10 BIP0038加密私钥例子 私钥(WIF) 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn 密码 MyTestPassphrase 加密私钥(BIP0038) 6PRTHL6mWa48xSopbU1cKrVjpKbBZxcLRRCdctLJ3z5yxE87MobKoXdTsJ 4.5.2 P2SH (Pay-to-Script Hash)和多重签名地址 正如我们所知,传统的比特币地址从数字1开头,来源于公钥,而公钥来源于私钥。虽然任何人都可以将比特币发送到一个1开头的地址,但比特币只能在通过相应的私钥签名和公钥哈希值后才能消费。 以数字3开头的比特币地址是P2SH地址,有时被错误的称谓多重签名或多重签名地址。他们指定比特币交易中受益人作为哈希的脚本,而不是公钥的所有者。这个特性在2012年1月由BIP0016引进,目前因为BIP0016提供了增加功能到地址本身的机会而被广泛的采纳。不同于发送资金到传统1开头的比特币地址的交易,也被称为P2PKH,资金被发送到3开头的地址时,不仅仅需要一个公钥的哈希值,同时也需要一个私钥签名作为所有者证明。在创建地址的时候,这些要求会被定义在脚本中,所有对地址的输入都会被这些要求阻隔。...

Continue reading...

区块链的1.0时代:比特币 – 第4章 密钥、地址、钱包

4.1 简介 比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库 中,称为钱包。存储在用户钱包中的数字密钥完全独立于比特币协议,可由用户的钱包软件生成并管理,而无需区块链或网络连接。密钥实现了比特币的许多有趣特 性,包括去中心化信任和控制、所有权认证和基于密码学证明的安全模型。 每笔比特币交易都需要一个有效的签名才会被存储在区块链。只有有效的数字密钥才能产生有效的数字签名,因此拥有比特币的密钥副本就拥有了该帐户的比 特币控制权。密钥是成对出现的,由一个私钥和一个公钥所组成。公钥就像银行的帐号,而私钥就像控制账户的PIN码或支票的签名。比特币的用户很少会直接看 到数字密钥。一般情况下,它们被存储在钱包文件内,由比特币钱包软件进行管理。 在比特币交易的支付环节,收件人的公钥是通过其数字指纹表示的,称为比特币地址,就像支票上的支付对象的名字(即“收款方”)。一般情况下,比特币 地址由一个公钥生成并对应于这个公钥。然而,并非所有比特币地址都是公钥;他们也可以代表其他支付对象,譬如脚本,我们将在本章后面提及。这样一来,比特 币地址把收款方抽象起来了,使得交易的目的地更灵活,就像支票一样:这个支付工具可支付到个人账户、公司账户,进行账单支付或现金支付。比特币地址是用户 经常看到的密钥的唯一代表,他们只需要把比特币地址告诉其他人即可。 在本章中,我们将介绍钱包,也就是密钥所在之处。我们将了解密钥如何被产生、存储和管理。我们将回顾私钥和公钥、地址和脚本地址的各种编码格式。最后,我们将讲解密钥的特殊用途:生成签名、证明所有权以及创造比特币靓号地址和纸钱包。 4.1.1 公钥加密和加密货币 公钥加密发明于20世纪70年代。它是计算机和信息安全的数学基础。 自从公钥加密被发明之后,一些合适的数学函数被提出,譬如:素数幂和椭圆曲线乘法。这些数学函数都是不可逆的,就是说很容易向一个方向计算,但不可 以向相反方向倒推。基于这些数学函数的密码学,使得生成数字密钥和不可伪造的数字签名成为可能。比特币正是使用椭圆曲线乘法作为其公钥加密的基础算法。 在比特币系统中,我们用公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥用于比特币支付时的交易签名。 公钥和私钥之间的数学关系,使得私钥可用于生成特定消息的签名。此签名可以在不泄露私钥的同时对公钥进行验证。 支付比特币时,比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生成)。比特币网络中的所有人都可以通过所提交的公钥和签名进行验证,并确认该交易是否有效,即确认支付者在该时刻对所交易的比特币拥有所有权。 大多数比特币钱包工具为了方便会将私钥和公钥以密钥对的形式存储在一起。然而,公钥可以由私钥计算得到,所以只存储私钥也是可以的。 4.1.2 私钥和公钥 一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆 曲线乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。在本节中,我们将从生成私钥开...

Continue reading...

区块链的1.0时代:比特币 – 第3章 比特币客户端

3.1 比特币核心:参考实现 你可以从bitcoin.org下载标准客户端,即比特币核心,也叫“中本聪客户端”(satoshi client)。它实现了比特币系统的所有方面,包括钱包、对整个交易账簿(区块链)完整拷贝的交易确认引擎,和点对点比特币网络中的一个完整网络节点。 在Bitcoin网站的选择钱包页面, 下载参考客户端比特币核心。根据操作系统不同,你将下载不同的可执行安装工具。对于Windows,它是一个ZIP归档文件或.exe格式的可执行文件。 对于Mac OS,它是一个.dmg格式的磁盘映像。Linux版本包括用于Ubuntu系统的PPA包,或是 tar.gz格式的压缩包。图3-1所示的Bitcoin.org页面上列出了一些推荐的比特币客户端。 3.1.1 第一次运行比特币核心 如果你下载了一个安装包,比如.exe、.dmg、或PPA,你可以和安装其它任何应用程序一样,在你的操作系统上安装它。对于Windows,运 行.exe文件,按照提示一步步操作。对于Mac OS,启动.dmg文件,然后将Bitcoin-QT 图标拖拽到你的应用程序目录就可以了。对于Ubuntu,在文件资源管理器中双击PPA文件,会打开程序包管理器来安装它。一旦完成了安装,在你的应用程 序列表中会有一个新的应用叫Bitcoin-QT。双击这个图标就可以启动比特币客户端了。 第一次运行比特币核心时,它会开始下载整个区块链,这个过程可能需要数天(见下图)。让它在后台运行,直到显示“已同步”,并且余额旁边不再显示“数据同步中”。 比特币核心拥有交易账簿(区块链)的一份完整拷贝,里面记录了自2009年比特币网络被发明以来发生在比特币网络上的每一笔交易。这个数据集有几个 GB(在2013年底大约是16GB),并且需要几天的时间完成增量形式的下载(从区块0顺次下载到最新区块)。在整个区块链数据集下载完成前,客户端将 不能处理任何交易或是更新账户余额。在下载数据集的过程中,客户端账户余额旁会显示“数据同步中”,底部会显示“正在同步”。请确保你有足够的磁盘空间、 带宽和时间来完成初始同步。 3.1.2 从源码编译比特币核心比特币核心 对于开发者,可以选择下载包含完整源代码的ZIP包,也可以从Github上克隆权威的源码仓库。在面GitHub上的比特币页面,在侧边栏选择下载ZIP。或者使用git命令行(git command line)在自己系统上创建源码的本地拷贝。在下面的例子中,我们将通过unix风格的命令行,在Linux或是Mac...

Continue reading...

区块链的1.0时代:比特币 – 第2章 比特币的原理

与传统银行和支付系统不同,比特币系统是以去中心化信任为基础的。不同于中央信任权威系统,在比特币中,信任是由比特币系统中不同参与者之间交互来达成的一种自然属性。在本章中,我们将从一个较高层面检视比特币,通过追踪一笔比特币系统中的单独交易,来看看它在比特币分布式共识机制中变得“被信任”和被接受的情形,以及最终成功地被存储到区块链(区块链是一个分布式的公共账簿,包含所有发生在比特币系统中的交易)。 书中每一个例子都是比特币网络中发生的真实交易,通过将资金从一钱包发送到另一钱包来模拟用户(Joe、Alice和Bob)间的交互。我们在追踪一笔通过比特币网络和区块链的交易时,将用到一些区块链数据库查询网站使每个步骤可以方便在网页上直接被呈现。提供区块链数据查询的网站就像是一个比特币的搜索引擎,你可以搜索比特币的地址、交易和区块,以及可以看他们之间的关系和资金流动。 常见的区块链数据查询网站包括: ▷ Blockchain info ▷ Bitcoin Block Explorer ▷ insight ▷ blockr Block Reader 以上每一个查询网站都有搜索功能,可以通过地址,交易哈希值或区块号,搜索到在比特币网络和区块链中对应的等价数据。我们将给每个例子提供一个链接,可以直接带你到相关条目,方便你做详细研究。 2.1.1 比特币概述 图2-1 比特币概述 如图2-1所示的概述图中,我们可以看到比特币系统由用户(用户通过密钥控制钱包)、交易(每一笔交易都会被广播到整个比特币网络)和矿工(通过竞争计算生成在每个节点达成共识的区块链,区块链是一个分布式的公共权威账簿,包含了比特币网络发生的所有的交易)组成。在本章中,我们将通过追踪在网络上传输的一笔交易,从整个比特币系统的的视角检视各个部分之间的交互。后续章节将详细阐述钱包、挖矿、商家系统背后的技术细节。 2.1.2 买咖啡 在之前章节里,Alice是一名刚刚获得第一枚比特币的新用户。在“1.4.2 获取你的第一枚比特币...

Continue reading...

区块链的1.0时代:比特币 – 第1章 介绍

1.1 什么是比特币? 比特币是一个基于数字货币生态系统而形成的概念与技术的集合。在比特币网络中,比特币也作为参与者之间的价值储存和传递。尽管也可以使用其它传输网络,但比特币用户还是主要在因特网上,利用比特币协议相互交流。作为一款开源软件,比特币的协议栈可以在包括笔记本电脑和智能手机在内的多种设备上运行,这使得比特币技术易于获取,用于买卖商品、给组织或个人汇款,或是延长贷款期限。比特币在特殊的货币交易所可以购买、出售,以及与其他币种进行兑换。从一定意义上来说,比特币就是互联网货币的完美形态,因为它的快捷、安全以及无国界的特性。 不同于传统的货币,比特币是完全虚拟的。没有实物的货币,甚至就本质而言,也没有数字货币。比特币隐匿于发送者和接收者间价值传递的交易中。比特币用户拥有能够使他们在比特币网络中证明自己交易权的密钥,解密后可使用比特币,也可以将它购买、,出售,以及与其他币种进行兑换。由于比特币快捷、安全以及无国界的特性,在某种意义上,比特币就是互联网货币的完美形态。 用传统货币能做到的事情,用户在网络上利用比特币都可以做到,包括发送给新的接收者。这些密钥通常存储在每个用户的计算机的数字钱包里。每一笔交易都需用密钥解密,这是使用比特币的唯一先决条件,它完完全全掌握在每个用户的手中。 比特币是一个分布式的点对点网络系统。因此,没有“中央”服务器,也没有中央控制点。比特币是通过一个名为“挖矿”的过程产生的,挖矿需要在处理比特币交易的同时参与竞赛来解决一个数学问题。在比特币网络中的任何参与者(比如,任何人使用一个设备来运行完整的比特币协议栈)都是潜在的矿工,用他们电脑算力来验证和记录交易。每隔10分钟,有人能够验证过去10分钟发生的交易,作为回报,将会获得崭新的比特币。从本质上讲,比特币挖矿分散了中央银行的货币发行,也分散了其结算功能,并且能够在全球竞争中取代任何一家中央银行。 比特币协议包括了内置算法,该算法可以调节网络中的挖矿功能。矿工必须完成的任务——在比特币网络中成功地记录一个区块交易——的难度是在动态调整的,因此,无论何时有多少矿工(多少CPU)在挖矿,通常每10分钟就会有人成功。 新比特币开采出的每四年,这项协议也会减半开采速率,并限制比特币的开采总量为一个固定值:2,100万枚。其结果是,在流通中的比特币数量很容易根据预测曲线得出,将会在2140年达到2,100万枚。由于比特币的发行率是递减的,从长期来看,比特币是一种通货紧缩的货币。此外,通过超出预期发行率来“印刷”新比特币,造成通货膨胀是不可实现的。 实质上,比特币本身也是协议,是一种网络,是一种分布式计算革新的代名词。比特币通货仅是这种创新的首次应用。作为一个开发者,我看到比特币类似于互联网货币,一个通过分布式计算来传播价值和保障数字资产所有权的网络。比起初识比特币,这里将知无不言。 在本章中,我们将会从一些主要概念和术语解释开始,获取必备软件,使用比特币进行简单的交易。在接下来的章节里,我们将开始揭开使比特币成为可能的技术面纱,解释比特币网络和比特币协议的内部运行机制。 比特币之前的数字货币 切实可行的数字货币的出现是与密码学发展息息相关的。基本的挑战在于,当一个人考虑到用比特来代表可以兑换商品和服务的价值时,接受数字货币也就不足为奇。任何接受数字货币的人都面临的两个基本问题是: 我能相信这钱是真实可信的,而不是伪造的吗? 我能确定没人说这笔钱是他们的,而不是我的吗?(又名“双重支付”问题) 纸币的发行机构不断的利用日益复杂的纸张和打印技术来遏制造假问题。实物货币很容易解决双重支付问题,因为同一张纸币不可能会同时出现在两个不同的地方。当然,传统货币也经常数字化储存和数字化传输。在这些情况下,假币和双重支付问题是被中央权威机构的处理方式是清除所有的电子交易记录,该中央权威在流通中持有一种全球通货观。对于数字货币来说,不能有效利用秘制油墨印刷技术或条形全息图,密码学为用户所主张的合法性价值提供了信任的基础。具体地来说,加密数字签名能够使一个用户签署一项能够提供其资产所有权证明的数字资产或数字交易。采用适当的结构,数字签名也可以用于解决双重支付的问题。 在20世纪80年代后期,当密码学开始越来越广泛地使用并被理解时,许多研究人员开始尝试使用密码学来建立数字通货。这些早期的数字通货项目发行的数字货币,通常倚靠一种国家通货或像黄金一样的贵金属。 虽然这些早期的数字通货的运行了,他们却是中心化的,因此,他们很容易遭受到政府和黑客的攻击。早期的数字通货使用了一个中央结算所来处理所有的定期交易,就像一个传统的银行系统。不幸的是,在大多数情况下,这些新兴的数字货币成为了政府担忧的目标,最终从法律程序上消失了。另一些则是在发行这些数字货币的母公司突然违约时颓然失败了。为了坚定的抵制对手的介入,无论这些对手是合法的政府或是犯罪分子,去中心化的数字货币需要的是避免单节点攻击。比特币正是这样的系统,设计完全去中心化,不被任何中央政权或中央点控制,这样的货币系统是不会遭受攻击,也不会变得腐败。 比特币代表了数十年的密码学和分布式系统的巅峰之作,这是一个独特而强大的组合,汇集了四个关键的创新点。比特币由这些构成: ▷ 一个去中心化的点对点网络(比特币协议) ▷ 一个公共的交易账簿(区块链) ▷ 一个去中心化的数学的和确定性的货币发行(分布式挖矿) ▷ 一个去中心化的交易验证系统(交易脚本)...

Continue reading...