比特币操作手册
比特币交易
交易就像复式账本的一笔笔记录,每个交易均包含一到多条的“输入”——这是比特币账户的借方。每笔交易也包含了一到多条的“输出”——这是比特币账户的贷方。输入和输出(借和贷)加起来不要求相等。实际上,输出加起来的和应稍小于输入的和,这个差额就是隐含的“交易费用”,这笔小额费用归那些将交易归集到账本的矿工所有。
比特币交易的基本结构单元是未花费输出,或者被称为UTXO,UTXO是一个不可拆分的比特币结构,锁定一个特定的所有者,记录在区块链上,并被全网看作一个货币单元。比特币网络跟踪数以百万计的所有有效(未花费)UTXO。当一个用户接收到比特币,金额就以UTXO的形式记录在区块链上。这样,一个用户的比特币资金可能会以UTXO的形式分散存放在数百个交易和区块上。实际上,没有任何东西会去记录一个比特币地址或者账户的余额,只有分散的UTXO,锁定到特定的所有者。用户比特币账户余额的概念是钱包应用软件从传统应用中继承而来的。钱包软件通过扫描区块链,收集所有属于这个用户的UTXO,以此来统计用户的余额。
创建交易:一旦交易被创建,它将被资金来源的所有者签名授权。如果交易的格式正确,签名合法,签名后的交易就被认定为有效,它包含了用于执行资金转移的所有必需信息。最后,有效交易必须送达比特币网络,并被传播出去,直到被一个矿工包含到公开账本(区块链)之中。
将交易广播到比特币网络:首先,交易需要送达比特币网络,这样才能被传播出去并被加入区块链。
交易在比特币网络中传播 一旦比特币交易发送到任意一个与比特币网络相连的节点,交易就将被这个节点进行验证。如果有效,这个节点会继续将其传播到其他相连的节点上,交易发起者也会同步接收到一个成功应答。如果交易被验证为无效,接收节点将拒绝交易,并返回一个拒绝交易的消息给交易发起者。
其中涉及到:
地址转换。一个交易中输出的币,要么在另一个交易中被完全消费掉,要么就一个都不被消费。
有效验证。当一个新的交易被加入总账,它的有效性是使用了哈希指针核查。从引用的交易开始,核查到账本上最新记录的交易为止即可。
资金合并。比特币交易可能有许多输入与输出,资金分隔与合并也很容易。交易里有两个输入和一个输出,输出的地址是他自己的地址,这样,鲍勃就把两个交易合二为一了。
交易语法
- 元数据交易结构。这里存放一些内部处理的信息:包含这笔交易的规模、输入的数量、输出的数量,还有此笔交易的哈希值,也就是这个交易独一无二的ID。我们可以用哈希指针指向这个ID。最后还有一个“锁定时间”(lock_time),我们后面会谈到。
- 输入。交易消费的UTXO叫作交易输入。所有输入排成一个序列,每个输入的格式都是一样的。输入需要明确说明之前一笔交易的某个输出,因此它包括之前那笔交易的哈希值,使其成为指向那个特定交易的哈希指针。这个输入部分同时包括之前交易输出的索引和一个签名:我们必须有签名来证明我们有资格去支配这笔比特币。
- 输出。交易创建的UTXO叫作交易输出。所有输出也排成一个序列。每个输出的内容分成两部分。所有输出的金额之和必须小于或等于输入的金额之和。当输出的总金额小于输入总金额时,输出的总金额与输入的总金额的差额部分,就作为交易费支付给为这笔交易记账的矿工。
铸币(coinbase)交易
铸币交易是每个区块的第一笔交易。这笔交易是矿工“赢家”放进区块的,作为矿工挖到区块的奖励。这也就是比特币系统在挖矿过程中发行新币的过程。
交易费用
大多数交易包含交易费用,提供给为比特币网络安全做出贡献的矿工作为报酬。交易费用基于交易大小进行计算,以千字节为单位,而不是基于交易价值计算。总的来说,交易费用是基于网络中的市场力量来设置的。矿工们基于不同的规则包括交易费用,对交易的优先级进行排序,在一定条件下,他们也免费处理交易。交易费用影响交易处理的优先级,也就是说,含有足够费用的交易更有可能被包含进最近的下一个区块,而费用不足或者没有费用的交易就可能被延迟,并遵循尽量处理的原则在后面的区块中被包含,或者干脆就得不到处理。交易费用不是必需的,没有费用的交易最终可能也会被处理;但是附加一定费用会提高处理的优先级。交易的数据结构中并没有费用字段。实际上,费用隐含在交易输入汇总和交易输出汇总的差值中。交易输入加总扣除所有输出后,剩余的金额就成为交易费用,最终被矿工收集走。交易费用是隐含的,是输入减输出的差额。
费用是交易中很容易让人感到迷惑的因素,但也是一个必须弄懂的关键点。如果用户自己创建交易,就必须确保不会因为疏忽而使用太少的输入以此形成一笔很大的交易费用。也就是说,你必须计算所有的输入,必要时创建找零,否则你将向矿工贡献一笔巨额的小费!
比特币存储
储存比特币其实就是如何保存和管理比特币私钥。
- 本地存储:电脑,手机,U盘
- 比特币钱包
- 热钱包,指软件,在线设备。
- 冷钱包,指物理设备,离线设备。
比特币交易所
比特币交易所和银行很像。交易所可以办理比特币存款,日后需要用钱的时候,可以到交易所提款。你还可以把法定货币(法币)——例如美元、欧元等存到比特币交易所,交易所承诺日后会按照你的要求把钱——比特币或法币,或两者都有——还给你。也可以通过交易所办理类银行业务,例如,用比特币付款或收款。还可以通过交易所把比特币兑换成法币,或把法币兑换成比特币,交易所在该业务中通常起撮合作用,它们同时寻找愿意兑换法定货币和愿意兑换比特币的人,并安排他们作为交易对手,如果交易对手对于汇率达成一致意见,交易所就促成这笔交易。
比特币挖矿
新比特币产生的过程之所以叫作挖矿,是因为其奖励机制是模拟收益递减的,就像贵金属矿产的挖掘工作,越挖越少。比特币的货币供应通过挖矿来实现,类似中央银行通过印钞来发行货币。矿工可以加入区块的新比特币数量大概4年(精确地说是每210000个区块)就会减少一次。2009年1月,比特币网络刚开始运行的时候,每挖出一个区块有50比特币产生;到2012年11月,这个数额就减少一半,降到25比特币。到2016年7,已降至12.5比特币。基于这个公式,比特币挖矿奖励以指数级下降,大约到2140年,所有比特币(2099.999998万)都将被发行完毕。2140年后将不会再发行新比特币。
挖矿是维持比特币货币供应的一个过程。同时,挖矿也保护着比特币系统的安全,防止欺诈交易或者在不同交易里使用同一笔比特币资金,即双重支付。矿工向比特币网络提供处理能力,以交换获取比特币奖励的机会。
矿工验证新的交易,并把它们记录到全局账本上。每隔10分钟左右,一个包含上个区块产生以来发生的所有交易的新区块就会被矿工“挖”出,经过挖矿,这些新交易记录成为区块链的一部分。成为区块一部分并被加入区块链中的交易是“已确认的”交易,比特币的新所有者可以花费在这些交易中收到的比特币。
矿工们获得两种类型的挖矿奖赏:一种是每个新区块中产生的新比特币;另一种是新区块中包含的所有交易的交易费用。为了赢得这些报酬,矿工通过竞争的方式基于加密哈希算法解决一个极为复杂的数学问题。问题的解被称为工作量证明,包含在新区块中,作为矿工所付出的计算工作量的证明。竞争解决工作量证明算法、赢取奖励,以及在区块链上记录交易的权利,构成了比特币安全模型的基础。
比特币系统的信用是建立在计算的基础上的。交易打包进区块需要巨大的计算量来证明,但是验证这个证明只需很少的计算量。挖矿过程在比特币系统中有以下两个目的:
- 挖矿过程在每个新区块中创建新的比特币,就像中央银行发行货币。每个区块创建的新比特币数量是固定的,随着时间推移,这个数量会逐渐减少。
- 挖矿过程创造信用,需要确保只有足够算力投入到包含这些交易的区块后,交易才能得到确认。更多的区块意味着更多的计算量投入,也意味着更多的信用。
挖矿的过程就像一个大型的竞争性数字拼图游戏,当有人找到一个解决方案时,游戏就重新开始,而游戏的难度也会自动进行调整,使每找到一个解决方案的时间大致维持在10分钟。想象一个巨大的数字拼图,高度有几千行,宽度有几千列。如果我给你看已经填充好的拼图,你可以很快地验证有没有错误。但是,如果只填了一部分,剩下的都是空白,那就需要花费大量的时间才能解决。数字拼图游戏的难度可以通过调整尺寸(增减行列数)来调节,但是不管尺寸大小,其确认过程都很简单。比特币中用的“拼图”是建立在加密哈希算法之上的,它展现了与拼图类似的特性:它也是不对称的,很难解决却很容易验证,而且它的难度也可以调整。
全网每秒要进行几万亿次的哈希计算。比特币中的工作量证明算法是采用SHA256加密哈希函数不断地对区块头和一个随机数进行哈希计算,直到找到一个与预设的模式匹配的方案。第一个找到这个解决方案的矿工将赢得这一回合的竞争,随即将这个区块发布到区块链当中。
挖矿就是通过不断修改一个参数,重复计算区块头的哈希,直到找到一个与目标值匹配的哈希的过程。哈希函数的结果无法提前预知,也不能创建一个模式使其产生特定哈希。哈希函数的这个特性意味着,生成哈希结果并匹配特定目标的唯一途径就是不停地尝试,通过随机修改输入,生成不同哈希,直到碰巧得到希望的结果。
哈希算法利用任意长度的数据作为输入,生成一个固定长度的确定结果,即输入数据的数字指纹。对于任意特定的输入,结果总是相同的,只要实现了相同哈希算法,都可以轻易计算并验证。加密哈希算法的关键特性是对于两个不同的输入,几乎不可能生成相同的指纹
验证新区块
当新发现的区块在网络中传播时,每个节点在将其继续发送到它的对等节点前,会进行一系列的测试工作,以验证其有效性。结果就是,只有有效的区块才会被传播到网络当中。独立验证也保证了诚实矿工挖出的新区块能被区块链接纳,并赢得奖励。而那些不诚实的矿工,其区块将被拒绝,不仅失去奖励,也浪费了寻找工作量证明解的努力,甚至连电力成本都无法得到补偿。 当一个节点接收到新区块时,它将依据一个长长的规则列表对其进行验证,如果不符合任一要求,区块将被拒绝。这些规则可以在比特币核心客户端的函数CheckBlock和CheckBlockHeader中查到,主要包括如下内容。 ●区块数据结构的语法正确。 ●区块头哈希比目标难度小(确保满足工作量证明要求)。 ●区块的时间戳早于未来2小时(允许时间错误)。 ●区块大小在允许范围内。 ●第一个交易(只有第一个)是一个铸币交易。 ●区块中的所有交易有效,通过交易检查列表验证(参看本章中“独立交易验证”)。
组装和选择区块链
比特币共识机制的第四个步骤是区块链的组装和最大累积工作量(最大难度)的区块链的选择。一旦节点完成一个新区块的验证,它将尝试将区块和已存在的区块链进行连接,形成新的链条。 节点维护着三套区块的集合:连接到主区块链的区块;形成主链分支的区块(次链);在已存在的链中均找不到父区块的新区块(孤儿)。只要不符合验证规则的任意一条,无效区块会立即被拒绝,不会被加入任何区块集合中。
- 矿工任务
- 1.监听交易广播。监听网络上的交易广播,然后验证它们的签名是正当有效的,交易输出没有被重复支付。
- 2.维护区块链网络和监听新的区块。必须先维护区块链。为了做到这一点,一开始你可以要求其他节点把区块链上的历史记录(在你加入区块链网络之前的)同步过来。然后,监听那些被广播到网络上的新的区块。你的任务是验证你收到的每个区块,这里的验证是指保证区块里的每笔交易都是有效的,而且这个区块包含了一个有效的随机数。
- 3.组装一个备选区块。一旦拥有最新的全部区块链数据备份,你就可以开始制造你自己的区块了。要做到这一点,你要把所监听到的交易进行组合并放进一个新的区块,然后把该新区块排在整条链中最新的区块的后面。你必须保证你建立的新区块里的每笔交易都是正当有效的。
- 4.找到一个让你的区块有效的随机数。
- 5.区块被全网接受。
- 6.利润。如果所有其他矿工接受了你的区块,那你就能获取利润。
矿池
由于比特币全网的运算水准在不断的呈指数级别上涨,单个设备或少量的算力都无法在比特币网络上获取到比特币网络提供的区块奖励。在全网算力提升到了一定程度后,过低的获取奖励的概率,促使一些“bitcointalk”上的极客开发出一种可以将少量算力合并联合运作的方法,使用这种方式建立的网站便被称作“矿池”(Mining Pool)。
在此机制中,不论个人矿工所能使用的运算力多寡,只要是透过加入矿池来参与挖矿活动,无论是否有成功挖掘出有效资料块,皆可经由对矿池的贡献来获得少量比特币奖励,亦即多人合作挖矿,获得的比特币奖励也由多人依照贡献度分享。
截止2019年1月,全球算力排名前五的比特币矿池有:BTC.com 、Poolin、AntPool、slush pool、、F2Pool,全球约70%的算力在中国矿工手中。
矿池就是一个比特币矿工互相之间的保险。一组矿工可以形成一个矿池共同进行挖矿,并指定一个币基接受人。这个接受人就是矿池管理员。所以不管是谁最终发现了一个有效区块,矿池管理员将会收到这个区块的奖励,继而根据每个参与者所贡献的工作量按比例分配给所有矿池的参与者。
比特币区块链浏览器
Blockchain info(http://blockchain.info)。
Bitcoin Block Explorer(http://blockexplorer.com)。
insight(http://insight.bitpay.com)。
blockr Block Reader(http://blockr.io)。
比特币客户端
bitcoin.org可以下载比特币的标准客户端比特币核心(Bitcoin Core),也被称为“中本聪客户端”。这个标准客户端实现了比特币系统的所有功能,包括钱包、一个交易验证引擎(用于对全部交易账本,即区块链的全量副本进行交易验证),以及一个用于接入点对点比特币网络的完全网络节点。
公钥 私钥
(公钥私钥的技术细节参考 第五章 技术部分) 私钥和公钥
一个比特币钱包通常包含一些密钥对的集合,每个密钥对包含一个私钥和一个公钥。私钥(k),是个数字,通常随机获取。从私钥出发,利用椭圆曲线乘法(一种单向加密函数),可以计算出一个公钥(K)。从公钥出发,利用单向加密哈希函数可以生成比特币地址
私钥
一个私钥就是一串随机提取的数字,拥有和控制私钥是用户控制与比特币地址相关联的资金的根本。用户交易时想证明使用的资金是他自己的,必须使用其私钥对交易进行签名。在任何时候均必须保证私钥的私密性,将私钥透露给第三方,等同于把由它保护的比特币的控制权交给了第三方。私钥同样要进行备份、保护,防止意外丢失。如果私钥丢失,将是不可恢复的,受它保护的资金也就彻底丢失了
要生成私钥,第一步也是最关键的一步是找到一个安全的熵源或者随机源。创建比特币密钥本质上就是“取得一个1到2256之间的数字”。如果能保证随机数获取的方式是不可预测、不可重复的,则实际采用哪种方法无关紧要。比特币软件利用操作系统底层的随机数生成器来生成256比特的熵(随机数)
私钥是从1到n-1之间的任意数字,其中n是一个常量(n=1.158×1077,这个数比2256略小),在比特币中这个常量是作为椭圆曲线的幂来定义的(参见本章中的“椭圆曲线加密算法解释”)。为了生成这样一个密钥,我们随机取一个256位长度的数字,并验证其是否小于n-1。以程序的术语,这通常是从一个密码学安全的随机源中抽取一长段字符串,并通过SHA256哈希算法进行计算,这样就可以很方便地生成一个256比特长度的数字。如果上述步骤结果小于n-1,我们就得到了一个合适的私钥。否则,我们需要重复以上步骤,直到最终得到一个合适的私钥。
公钥 公钥是使用椭圆曲线乘法从私钥计算得来的,这是一个不可逆的过程:K=k×G,其中,k是私钥,G是一个常数点(被称为生成点),K是计算结果,即公钥。其反向操作被称为“查找离散对数”——已知K,求k,其难度与尝试所有k的可能值的难度差不多,也就是说,与暴力求解基本等同
椭圆曲线加密算法
椭圆曲线加密算法是一种非对称加密算法,或者叫公钥加密算法,它的基础是以椭圆曲线上点的加法运算或乘法运算表示的离散对数问题。
比特币交易地址
比特币地址是一串由数字和字母构成的字符串,可以分享给任何想给你转钱的人。地址是从公钥转换而来的,包含数字和字母,其第一个字符是1(数字)
比特币地址是通过一种单向的加密哈希算法从公钥推导出来的。“哈希算法”是一种单向函数,它可以对任意长度的输入进行计算,生成输入信息的指纹或者“哈希”。加密哈希函数在比特币中应用广泛,包括比特币地址、脚本地址,以及挖矿中的工作量证明算法等。用于从公钥创建比特币地址的算法是安全哈希算法(SHA)和RACE完整性原语求值信息摘要算法(RIPEMD),应用的是其中两种特定算法,SHA256和RIPEMD160。
比特币地址与公钥不一样,比特币地址是利用单向哈希函数从公钥计算得来的。
钱包
钱包是保存私钥的容器,通常以结构化文件或者简单数据库的方式实现。另一个生成私钥的方式是确定性密钥生成。使用确定性密钥生成的情况下,可以通过单向哈希函数,从上一个私钥中生成一个新的私钥,按顺序连接,形成一个链条。如果需要重建这个链条,你只需生成第一个私钥(称之为种子或者主密钥),即可生成整个序列。
助记码词汇表
助记码是一些英文单词序列,用于代表(编码)一个随机数字,这个随机数字就是用于创建确定性钱包的种子。这个单词序列足以重建种子,并根据种子重建钱包及所有派生而来的密钥。一个实现了确定性钱包(带助记码功能)的应用,在首次启动时将会向用户展示一个12到24个单词的序列。这个单词序列就是钱包的一个备份,可以用于在相同的或者兼容的应用中恢复并重建所有密钥。助记码词汇表使用户钱包备份变得极为简单,毕竟相对一串随机数字,这些词汇更容易阅读和转录。
层次化确定性钱包(BIP0032/BIP0044)
开发确定性钱包的目的是实现从一个“种子”生成很多密钥。形式最先进的确定性钱包是层次化确定性钱包,或者叫HD钱包,在BIP0032标准中是这样被定义的。层次化确定性钱包所包含的密钥是一种树形结构,一个父密钥可以派生出一系列的子密钥,每个子密钥又可以派生出一系列孙密钥。以此类推,直到树的深度达到无穷大。
HD钱包有两大优势。第一,树结构可以用于表达额外的组织含义,比如,一个特定分支的子密钥用于接收来款交易,而另一个分支的子密钥用于支付交易的找零。不同分支的密钥同样可以用于公司财务设置,将不同的分支分配给不同的部门或子公司,用于特定用途或者会计账目。 第二,用户可以在不访问私钥的情况下创建一系列公钥。这使得HD钱包可以在不安全的服务器上使用,也可以针对每笔交易发放一个不同的公钥。公钥不需要提前预载或者派生,服务器也不需要保存用于花费资金的私钥