学习区块链随笔(三)

比特币地址的概念,交易参与实体为一组公私钥的组合,其中私钥是由程序生成的随机数,而公钥则是根据私钥经过一系列的计算生成的,公私钥之间存在一一对应的关系,公钥作为参与交易的账户名,在交易中被引用,用于指明一笔交易中的资金来源及去向,而私钥则作为交易过程中“验证密码”,用于确认某一交易的合法性。

私钥的长度被定为256比特,其可能的取值范围为0至2的256次方,与世界上的沙子的数量相当,能够保证在随机算法实现正确的情况下,基本不可能发生碰撞(生成两个完全一致的私钥),这也是比特币及整个密码学的基础。

比特币公私钥及钱包地址生成流程如下:

1.通过某种随机数生成算法产生一个256比特作为私钥。

2.然后再使用椭圆曲线加密算法(ECC)对这个私钥生成公钥。

3.公钥再通过一系列的哈希计算和Base58编码得到钱包地址。

比特币交易即从一个比特币地址向另个一比特币地址转账的过程,整个交易可能包含多笔转账。

地址A向地址B转账时,需要交纳笔手续费,手续费会被发送给挖出这个交易区块的矿工,作为挖矿奖励的一部分。

比特币交易有两种,一种是coinbase交易,也就是挖矿奖励,这种交易没有发送人。另一种是普通交易即普通地址间的转账交易。

比特币钱包是一个形象的概念,就是保存和管理比特币地址及对应公私钥对的软件。

Bitecoin Core是一个实现了全节点的比特币客户端,它的账本保存了2009年比特币面世以来的所有交易地记录。数据量185GB,全部同步需要几天时间。通常我们没有必要下载整个账本,可以下载一个轻量钱包,如Electrum。

除了电脑版钱包外还有网页版钱包,这类钱包对币的控制权通过登录网站的用户名和密码保证,安全性最差。因私钥由网站保管,理论上网站可以对用户的账户做任何操作。

比特币系统是一个参与节点互相验证的公开记账系统。而比特币挖矿的本质是争夺某一个区块的记账权。

获得记账权的节点会获取一定数量的比特币奖励,该奖励包含系统奖励和交易手续费,系统奖励作为比特币的发行手段。最初生产一个“交易记录区块”,可以获得50个比特币的系统奖励,为控制比特币发行数量,该奖励每4年就会减半,到2140年发完,最终有2100万个比特币。

比特币系统大约每10分钟会记录一个数据区块,这个数据区块包含了这10分钟内全网待确认的部分或全部交易。

所谓“挖矿”,就是争夺将这些交易打包成“交易记录区块”的权利。

比特币系统会随机生成一道数学难题,所有挖矿的节点一起参与计算这道数学题。首先算出结果的节点将获得记账权。

每个节点会将过去一段时间内发生的尚未经过网络公认的交易信息进行收集,检测,确认。最后打包并加密签名为一个无法被篡改的交易记录区块。并在或得记账权后将该区块进行广播,从而让该区块被全部节点认可,永久保存。

挖矿的原理,主要工作就是计算上文提到的数学难题,最先求解的矿工即可或得该区块的记账权。哈希算法,任意长度的输入值通过一定的算法,生成一个规定长度的字符串,输出的字符串即为该输入的哈希值,比特币系统采用SHA256算法。

比特币每个区块链生成时,需要把上一个区块的哈希值,本区块的交易信息的默克尔树根,一个未知的随机数拼在一起,计算一个新的哈希值,为保证10分钟产生一个区块,该工作必须具有一定的难度,即哈希值必须以若干个0开头,该随机数量能通过暴力枚举的方式获得,挖矿中计算数学难题即为寻找该随机数的过程。

某个矿工计算出该随机数后,则会进行区块打包并全网广播,其它节点收到广播后,只需要对包含随机数的区块惊醒一个哈希运算即可。若满足校验则接受这个区块并停止本地对当前区块随机数的寻找,开始下个区块随机数的计算。

​​​​​​随着​技术的发展进行一次哈希运算计算速度越来越快,同时随着矿工的拙见增多,算出满足哈希值以一定数量0开头的随机数的时间越来越短,为保证比特币始终按平均每10分钟一个区块的速度出块,必须不断调整计算随机哈希计算的平均次数,即调整哈希值以0开头的数量要求,比特币中每生成2016个区块就会调整一次难度,即调整周期大约是2周,也就是说对生成最新2016个区块花费的实际时间和按照10分钟出一个块生成2016个块的期望时间对比,如果实际时间大于期望时间则降低难度,如果时间小于期望时间则增加难度。同时,为了防止难度变化波动太大,每个周期调整幅度必须小于一个因子(当前为4倍),若幅度大于4倍,则按4倍调整,由于按照该幅度调整出块速度仍然不满足预期,因此会在下个周期里继续调整。

矿池原理,一般由一个企业维护维护一个矿池服务器,运行专业软件,协调矿池中矿工的计算任务,矿工不需要参与区块的验证工作,仅由矿池服务器验证即可,因此矿工也不需要存储历史区块,这极大地降低了矿工的算力及存储资源消耗。协调矿工计算的思路也非常简单,矿池将打包区块需要的交易验证完成后,发送给矿工,然后降低矿工的挖矿难度,比如某时期需要50个0开头,矿池会降低要求40个0开头,矿工找到一个40个0开头哈希值方案后,即可提交给矿池,矿池收到满足50个0开头的哈希值时,可提交给比特币网络。矿池来对接比特币网络,矿池中的矿工不可以,因为地址和验证信息矿池的。最后矿池按照矿工提交方案数量计算贡献的算力,最后根据算力分配收益。

比特币分叉,比特币去中心化的系统升级是非常困难的,要协调网络中每个参与者,升级必然会导致不同节点在一定时间为运行不同版本,于是就会产生分叉。

软分叉,新的代码逻辑向前兼容,即新规则产生的区块依然会被旧节点接受。硬分叉,新的逻辑无法向前兼容,即新产生的规则产生的区块无法被旧节点接受。

软分叉举例,旧版中有一个无意义的字段,coinbase data升级版要求该字段必须包含区块高度,同时版本信息由1修改为2,升级分为三个阶段。

第一阶段:矿工将版本号修改为2,此时校验按旧规则。

第二阶段:如果新的1000个区块中,版本号为2的区块个数超过75%时,则要求版本号为2的矿工按新规则打包区块,升级的矿工收到版本为2的区块时,按新规则校验,对版本为1的区块,仍然不校验该字段并接受。

第三阶段:如果新产生的1000个区块中,版本号2的区块个数超过95%,则升级的矿工只接受新规则区块,旧版本的不被接受。

软分叉虽然对系统的影响小,但为了保证向前兼容,不能新增字段。只能对现有数据修改,可升级的内容非常有限,同时因为这些限制,软分叉升级方案比较复杂,复杂的方案往往更容易产生bug,并且可维护性很差。

硬分叉,不向前兼容,旧版本矿工无法验证新版本的区块,新版本区块只被新版本矿工接受,因此新版本和旧版本矿工会形成两条链。硬分叉修改余地很大,方案简单,但会导致生态分裂,2017年8月硬分叉,比特币由一条链产生一条新的 比特现金。

猜你喜欢

转载自blog.csdn.net/u010145988/article/details/104417882