推荐《区块链启示录:中本聪文集》这本书, 原来早在2010年, BTC生态还不完善的时候, 社区中就已经畅想出了未来其它链上的特色方案, 中本聪也都一一做了教父级回应: coinbase币的成熟时间, 交易池, 交易确认机制, 防51%攻击, 防双重消费, 水龙头, 轻量级客户端, 链上只记录哈希(Layer2的思想), 矿池, 分布式域名系统
历史
- 比特币0.1版发布时, 仅用于Windows平台。(原来最初的代码是windows GUI版)
- 0号区块中包含着以下的信息:“《泰晤士报》2009年1月3日英国财政大臣正欲对银行业实施第二轮救助。” (英文的ASCII编码)
- 哈尔·芬尼是由中本聪亲自发送的第一枚比特币的接收人
- 2009年12月30日,工作量证明难度首次被自动调整。
- 匹萨订购系统。由mizerdearia承接。可以通过网站、命令行、智能手机、短信等方式订购匹萨。(哈哈,才有了后来著名的BTC匹萨日)
- 截至2014年3月14日,这是中本聪在2014年3月7日发表在p2pfoundation上的最后一篇文章:增加了一些DoS限制,移除了安全模式(0.3.19版)
Token
政府有三种方法为财政赤字提供资金:通货膨胀(加印新钞)、社会借款和税收
通货膨胀率
比特币是限量供应的,计划到2140年发行2100万枚,分发(每个区块所产生的比特币)的数量每4年减半。
第一个4年:1050万枚
第二个4年:525万枚
第三个4年:262.5万枚
第四个4年:131.25万枚
以此类推……
即初始通货膨胀率35%
coinbase的成熟时间
创建后,留出120个区块的成熟时间的目的是为了在用于支付前要完全确定该区块属于主链。您的节点在此期间不会对该区块做任何事情,只是等待别的区块添加到它后面。这段时间都不需要在线。
想法:coinbase的币20小时后可用
Transaction
bitcoin支持向IP地址发送的交易吗?
比特币最早的实现(如 Bitcoin Core 的早期版本)确实支持向一个特定的 IP 地址发送交易。这种方式被称为 “IP-to-IP 交易”,是比特币网络的一项实验性功能。然而,这种功能已经在比特币的主流实现中被弃用,原因包括隐私和安全问题。
IP-to-IP 交易的原理
- 概念:在 IP-to-IP 模式下,比特币客户端直接向目标 IP 地址发送比特币,最终是发送到区块链地址。
- 机制:
- 发送方和接收方都需要在线。
- 接收方需要运行一个支持这种功能的比特币客户端,并监听一个开放的端口。收到请求后,把自己的BTC地址发给发送方
- 交易会通过网络发送到目标 的BTC地址。
交易费
有了最近发布的基于交易费的激励机制,节点将会有动力处理它们所收到的所有支付交易。
比如 让每笔交易的输出值比输入值少1分钱, 这部分便是交易费
当所有2100万枚比特币都产生了之后,矿工维护比特币系统的工作激励将只限于维护比特币系统过程中所收取的交易手续处理费。
交易池
节点将交易保留在工作集中,直到进入区块。如果90%的节点包含这笔交易,那么每次发现一个新区块时,该交易就有90%的可能性存在于区块里。
即使一笔早期支付还没有进入区块链,如果这笔交易已经存在于所有节点的交易池,那么这笔钱的第二次支付也会被所有已经包含第一笔支付的节点所拒绝。
只需要为当前最好的分支保留一个未决交易池。当新区块进入最好的分支时,ConnectBlock函数从pending-tx池移除该区块的交易。如果另一个分支变得更长,就会调用主分支的DisconnectBlock函数转移主分支,而将主分支区块中的交易恢复到pending-tx池,并调用新分支的ConnectBlock函数,把同时存在于两个分支的所有交易移出来
脚本支持不同的交易类型
比特币内置的类Forth脚本语言的处理。例如,[‘TxOut:value:100.00 Script:DUP HASH1606fad...ab90EQUALVERIFY CHECKSIG’]。
首先,比特币有内置的脚本语言,尽管是非常简单的脚本语言(没有循环、指针,除了数学和密码外什么都没有)。
新交易是通过将签名和公钥压入解释器堆栈来完成验证,然后再运行TxOut脚本
脚本实际上是一种断言。它只是用来评估真假的方程式。
回复:交易和脚本:DUP HASH160...EQUALVERIFY CHECKSIG
这个设计支持各种可能的交易类型,包括托管交易、担保交易、第三方仲裁、多方签名等。
系统
DB
比特币使用了事务型数据库Berkeley DB。系统崩溃时不会丢失数据。系统收到交易时会立即写入数据库。
警报系统
中本聪讨论了他开发的一套警报系统,拥有某个私钥的人可以在比特币网络传递重要消息,目前只有中本聪本人有该私钥。例如可以在发现bug之后通报所有矿工进行软件的重要升级。
警报消息用一个私钥进行签名,这个私钥只有中本聪有。节点在收到警报时会做两件事:
· 在状态栏上设置警告信息。
· 让json-rpc接口的资金处理方法返回错误。
共识
- 相信最长链为有效链, 如果长度相等,就保留最早的那条.
- 接收方需要等待一小时,直到交易正式被确认进入了区块链。中本聪认为6个区块(每个区块10分钟,6个区块就是1小时)是适当的时间,让交易得以确认并成为区块链的永久部分。
- 节点表达接纳该区块的方式是着手在该区块后创建下一个区块,并将接受区块的哈希值作为上一个哈希值。
- 工作量证明是用类似于Hashcash的SHA-256(前面由一些0构成),而不是签名。
- 搜索结果是256位无符号十六进制数,其SHA-256值必须小于能成功产生区块的值。
- 工作量证明的难度每两周(2016个区块)调整一次,以达到整个网络平均每小时增加6个区块。如果过去的6×24×30个区块跨越的时间不到15天,那么区块就产生太快了,于是系统把工作量证明的难度增加一倍。
- 最低难度是32个零位
网络
区块广播也不在乎消息丢失。如果一个节点没有收到某个区块,当它收到下一个区块时就会意识到中间丢了一个,此时该节点会向网络请求那个遗漏的区块。
密码学
ECC
- 采用椭圆曲线密码(EDCSA)而非RSA的主要原因是交易字节数的多少。为了让每笔交易字节数尽可能少,保持区块大小可控,中本聪决定使用EDCSA。
- 比特币地址是公钥的160位哈希值
bitcoinaddress=RIPEMD-160(SHA-256(publickey))
- 中本聪决定使用公钥的哈希值而非公钥本身作为比特币地址。中本聪这么做有两个原因。一是减小每笔交易的长度,因为哈希值只有160位长。二是简单地提高了安全性,以防比特币所用的非对称加密算法中发现后门或安全缺陷。为了能使用比特币,黑客必须首先从哈希值中推导出公钥,然后从公钥中推导出私钥
- 为了验证一笔交易,节点从签名中取得公钥,用以验证实际签名。如果签名有效,则对公钥进行哈希计算,确认哈希值与上一笔交易中分配的比特币地址相同。按照定义,如果两个都对上了,那么交易正常。
- 如果签名也被攻破了, 还可以切换到更健壮的系统。当首次运行升级后的软件时,将会用新的更强的签名算法为所有的币重新签名。(通过创建一笔交易,用更强的签名把币支付给自己。)
SHA
- 如果SHA-256全面崩溃,我们可以达成某种一致,即把在问题开始前的那部分算作是诚实链,并锁定诚实链,然后从那一点采用新的哈希函数往下继续。
随机种子
- BTC的随机种子考虑得非常严密。使用Windows所有的性能监控数据,包括启动后对磁盘性能、网卡指标、CPU时间以及分页等的测量。Linux有内置的熵收集器。再加上每次鼠标在比特币窗口移动时产生并由磁盘操作所捕获的熵。
盲签
-
生成公钥的额外盲变种密钥的方法。盲变种密钥具有与源公钥相同的属性,例如私钥可以为这些盲变种密钥生成签名。其他人无法判断这些盲密钥是否与根密钥相关,或者其他的盲密钥是否来自于同一个根密钥。这些都是盲化特性。简而言之,盲化就是x=(x×large_random_int)mod m。
-
如果使用一次性公钥为输出项哈希值和当前区块编号的组合签名。那么当输出项哈希值首次创建时采用公钥进行记录。当使用该输出项时,哈希由一个不同但相关的签名进行验证,该签名也是由相同的密钥签署的。
盲公钥相当于交易中比特币地址的公钥。如果说比特币地址的公钥私钥对是P/p,那么盲公钥就是P1,P2,P3,…,Pn。其中每个都可以验证私钥(p)签名。
所以在创建过程中,当提交输出项的哈希值进行验证时,看起来就像是由P1签署的。然而,当接收者取消该输出项时,则会以P2或P1以外的其他密钥签名(因为P1已经被公开记录)。两个签名的结果都一致,但是公钥会更换。这就意味着只有公用私钥的拥有者才能生成签名
群签名
- 使用群签名可以在签名之后不让人知道是谁签的。
举个例子,比如必须下令进行一次不太受欢迎的军事攻击,但是没人愿意作为下令者成为历史的罪人。如果10位领袖都有私钥,其中一位签署了命令而你并不知道具体是谁签的。
其它
- 可信计算(当时还只是研究)
- 使用现代处理器用于支持“可信计算”的安全特性来强化比特币钱包
- 一种像sss的夏米尔(Shamir)秘密共享方案的实现。类似于ssss的工具允许爱丽丝和鲍勃指定仲裁方以防发生分歧。
- ·买方把比特币发送给托管账户,并指明收款人的地址。
·卖方看到托管账户中的比特币后,注明比特币将发往的地址。
·买方把款放给卖方。
·托管账户会在x天后自动完成放款。
- ·买方把比特币发送给托管账户,并指明收款人的地址。
- 作废列表的想法
- 将前序交易和输出项计算哈希值后,如果该哈希值在区块列表中出现且仅出现过一次,那么就可以断定该输出项有效并且未被用过。
想法:作废列表
- 将前序交易和输出项计算哈希值后,如果该哈希值在区块列表中出现且仅出现过一次,那么就可以断定该输出项有效并且未被用过。
- 分布式哈希表(DHT)
- 用来最小化空间。还有一些细节尚未解决,但是您可以把它想象成将区块列表分割成1024个相同的小区块列表,每个小区块列表有10个冗余的验证节点。而不是具有10000个冗余的验证节点的单个区块列表。每个随机选取的节点集负责哈希空间的一部分。
矿池设想
矿池开采是一种多用户合作铸造比特币并且公平分享收益的方法。比特币矿池最好的类比是同事共同出钱买彩票,中奖后分享奖金。
矿池开采可以获得更小额、更频繁、更稳定的收益。如果您的电脑比较慢或者是一台CPU矿工,那么矿池开采可能是您能够铸造比特币的唯一方法。
-
首先会有一个网页让您注册,输入钱包地址,取得URL和矿工个人CPU/GPU的用户名与密码(rpcuser/rpcpass-word)。当以用户名和密码启动自己的矿机时,服务器将把尚未分配给集群其他成员计算的工作发送给你。
如果您一天提供了100万次哈希/秒的算力,而整个集群的算力是2000万哈希/秒,并且花了两天才找到一个区块,那么属于您的奖励将是(50/20/2=)1.25枚比特币。
-
矿池难度: 矿池服务器会要求每个客户为此计算一些哈希值。每个客户要提交他们发现的高于某个特定难度阈值的哈希值。服务器选择的难度为当前“官方”难度的1/40。
矿池验证: 因为需要一个不同的哈希值才能将生成的比特币支付给其他人。如果不诚实的客户端作弊,把产生的哈希值所生成的比特币支付给他们自己,那么他们提交的哈希值在我的服务器上无法通过验证,并且我也不会向他们分配任何利益。服务器得到了远程采矿客户端发回的候选哈希值消息流。时不时会有一个哈希值可以满足官方的难度要求,这样我的服务器就可以产生一个区块,并赚到50枚比特币。
-
然后,矿池将比特币分给远程采矿客户端,即为当前区块提交大于或等于1/40官方难度哈希值1枚比特币的比例分配。
对于矿池运营商来说,最简单的方法就是等到发现下一个区块时,将其按比例分配为:用户达标次数/所有人总达标次数。
提交哈希值发现了区块的人都应该从总收入中多分一些,比如10枚比特币。
分布式域名
比特域名服务(BitDNS)
有人建议创建一种比特币克隆版(一种替代币),以运行分布式点对点域名服务器系统(DNS)。除了货币以外,存储在区块链中的交易也包含DNS信息,并且可以用新的交易更新。
允许人们注册以.bit
结尾的域名并与IP地址关联。
-
往期精彩回顾:
- 区块链知识系列
- 密码学系列
- 零知识证明系列
- 共识系列
- 公链调研系列
- BTC系列
- 以太坊系列
- EOS系列
- Filecoin系列
- 联盟链系列
- Fabric系列
- 智能合约系列
- Token系列