1.比特币在设计的过程中很多地方用到了哈希指针,如块头就包含指向前一个区块的哈希指针,指针保存的是本地内存的地址,只在这台计算机上才有意义,发送到其他计算机上就没有意义了,那么在发布区块的时候哈希指针是如何通过网络传输的呢?
??实际上,在比特币系统中,所谓哈希指针只是一种形象的说法,实际在用的时候,其实只有哈希,没有指针。回顾之前学习过的Block Header的数据结构,如下所示,我们可以得知, uint256 hashPrevBlock; 这里表示的就是前一个区块的哈希,实际上是没有指针的。
class CBlockHeader
{
public:
//header
int32_t nVersion;//当前使用的比特币协议的版本号,没法修改(4字节)
uint256 hashPrevBlock;//前一个区块块头哈希值(32字节),不能修改
uint256 hashMerkleRoot;//Merkle Tree的根哈希值(32字节);
//通过修改Merkle Tree中铸币交易的CoinBase域当作ExtraNonce来调整其根哈希值
uint32_t nTime;//区块产生时间,有一定调整余地(4字节);
//比特币系统并不要求非常精确的时间,这个时间可以在一定范围内调整
uint32_t nBits;//挖矿后的目标阈值编码后的版本(4字节);
//只能按照协议中的要求定期进行调整,不能随便改
uint32_t nNonce;//(4字节)单纯靠调整nonce的值很大概率找不到符合难度要求的
}
?? 那么,如何找到前一个区块的内容呢? 全结点一般是将这些区块存储在一个 (Key,Value) 数据库中,Key表示哈希值,Value表示区块的内容,有一个比较常用的 (Key,Value) 数据库——LevelDB。所谓的区块链是一个链表结构,实际上是在 LevelDB 里面,用哈希值串起来的。只要掌握最后一个区块的哈希值,用 LevelDB 查找 (Key,Value) ,就可以通过哈希值Key得到Value,就可以把最后一个区块的内容取出来。然后这个区块的Block Header里面又有指向前一个区块的哈希值,然后再去用 LevelDB 查找 (Key,Value) ,就可以找到前一个区块的内容,以此类推,就可以把整条区块链都找出来。 ??所以,在实际系统之中,所谓的哈希指针是只有哈希没有指针的,或者也可以认为哈希值本身就是指针。有些结点没有保存区块链整条链上的全部信息,只保存了最近的几千个区块的信息,如果需要用到前面区块的信息,可以问其他全结点要,哈希指针的性质保证整个区块链是不可篡改的。
2.区块恋可能造成的问题
??据说曾经在七夕的时候,有一些情侣,两个人合在一起买比特币,然后将私钥从中间截断,分成两部分,每人保存其中的一段,将来如果两个人的关系继续,两段私钥合在一起就可以把钱取出来,如果两个人分手了,当初买的比特币就被永久地所在区块链上,谁也取不出来。这种情况叫“区块恋”,用区块的不可篡改性作为两人爱情的见证。 ??可能造成的问题: (1)如果有一个人把私钥丢失(或遗忘),都会导致比特币无法取出。 ??这种做法如果被推广下去的话是存在很大问题的,假设一个公司有四个商户,将私钥切成四份,一人保管其中一份,一个比较显然的问题是四个人中如果有一个人把私钥丢失(或遗忘),都会导致比特币无法取出。 (2)这种做法还会产生一个更大的问题:降低账户的安全性。 ??比特币系统中账户的安全性跟用户所用的私钥的长度是相关的,用256位的私钥就是因为这个长度的私钥用暴力破解的方式是不可行的,但是如果从中截断,就会大大降低其安全性。 ??回到“区块恋”的例子,假设情侣两人分手,其中一个人想要把比特币取出来,他已经拥有一半的私钥,那么只需要破解另外一半就可以,破解长度为256的私钥需要尝试的可能性为2256,而破解128位的私钥需要尝试的可能性为2128,是指数级的减小。在上面提到合伙人 例子中,如果有三个合伙人串通起来想要背着另一个人把比特币取出来,他们需要尝试的次数仅为256。 ??所以说对于多个人共同持有的账户,不能用私钥截断的方式,而应该使用多重签名的方式来保障安全性。 在多重签名(MULITISIG)中,每个人用到的私钥都是独立产生的,而且多重签名还具有很多灵活性,如N个人中只给出M个人的签名就可以验证通过。 (3)取不出来的钱将会永久被存在UTXO集合中,对矿工是不友好的。 ??假设“区块恋”的例子中的两个情侣分手,不存在其中有人有使用暴力手段破解私钥的情况,那么这些比特币将会永远花不出去,矿工并不知道这对情侣已经分手了,这些比特币是取不出来的,所以他需要永远把钱保存在UTXO中,这个操作对全结点是不友好的。
3.理论上,分布式共识是不可能的,为什么它能绕过分布式系统理论上证明的那些不可能结论?
??我们之前学习过比特币的共识协议,了解过分布式系统比较著名的不可能结论,从理论上证明,分布式系统中取得共识是不可能的,那么既然理论上已经证明了是不可能的,实际上为什么又变得可能了呢?就是说比特币系统为什么能取得共识,为什么它能绕过分布式系统理论上证明的那些不可能结论? ??严格意义上说,比特币系统并没有真正意义上的共识,因为取得的共识随时都有可能被推翻,如出现分叉攻击(本来你以为已经取得某项共识,分叉攻击之后,系统会回滚到前一个状态,从理论上说甚至有可能一直回滚到创世纪块),按照分布式系统理论上的要求,共识一旦达成就不应该再修改。从这个意义上说,比特币系统并没有绕过分布式系统那些不可能的结论,因为它并没有达到真正意义上的共识。理论和实际往往是有距离的,理论上的不可能只是在某种特定的模型下是不可能的,实际上把模型稍微改一改,这个不可能结论就不成立了。 ??如何判断远程数据中心的一台服务器是不是已经死机了。专家的看法是:分布式系统的理论已经证明了,在异步环境中,不可能区分某个远程服务器到底是死机还是运行缓慢。(所谓的异步环境是指通讯传播的延迟是没有上限的)但是实际上,我们可以给远程服务器的工作人员打个电话,让他们看看这个服务器是不是死机了,如果死机帮忙重启一下,这样下来,这个理论上不可行的案例,实际上就变成可行的了。或者给服务器加一根电话线,进行拨号上网,如果发现Internet执行缓慢可以试一下电话线,两根线一般不会出现同时拥堵的情况,这样就可以确认远程服务器是否死机。
“不要被学术化的思维限制了头脑。”
4.比特币的稀缺性
??比特币系统中的矿工为什么要挖矿?为了获得收益,挖矿的收益大于挖矿的开销,才是有利可图的。所以,想要吸引到更多人来挖矿,要么增加挖矿的预期收益,要么降低挖矿的开销。比特币诞生之初,挖矿的难度较低而且挖矿奖励比较高(50BTC),吸引大家来挖矿。 ??比特币的设计是非常巧妙的,我们之前计算过,每过大约四年时间,出块奖励会减半一次,也就是说比特币的总数是恒定的。有些人说这种总量恒定的东西是不适合作为货币的,以太坊就没有出块奖励定期减半的做法,有些加密货币甚至每过一段时间会自行通胀一次,因为稀缺的东西是不适合做货币的。 ??例如,古代使用黄金作为货币,但是放到现在就很不合适了,因为现在黄金的开采速度远远赶不上人们创造物质财富的速度,如果依然使用黄金做货币的话,就会造成一个现象:黄金越来越值钱,那么最开始拥有金子的人就不需要工作了,每天看着金子价格上涨就行,没有金子的人永远都不可能赶上之前那些人拥有的物质财富,这是非常不合适的。比特币最近几年的涨幅已经超过的北京的房价,如果感兴趣可以看看货币金融学方面的知识。
5.量子计算
??最近几年量子计算发展很快,有人产生这样一种担心:比特币这种加密货币是建立在密码学的基础上的,将来量子计算技术发展起来以后,这些加密货币会不会变得不安全? ??传说中的量子计算机是非常强大的,可以破解现存的各种加密算法,但是这个担心是不必要的。首先,量子计算机距离使用还有很长一段时间,虽然各种报道中说的它很厉害,但是距离实用还有很长时间,在比特币的有生之年不一定能产生实质性的威胁。而且,如果将来有一天量子计算真正强大到可以破坏现有的加密体系的话,首先受到冲击的是传统金融业,像网银、网上支付等等都会变得不安全。所以,与其担心量子计算对比特币的冲击还不如担心量子计算对传统金融业的冲击,因为大多数的钱都是存放在传统金融体系中的,加密货币的总市值现代金融体系的很少一部分,而且将来还会有量子加密算法。 ??第二,比特币系统中并没有把账户的公钥直接暴露出来,而是用公钥取哈希之后得到一个地址。比特币中用的是非对称加密体系,从私钥可以推导出公钥,所以只要将私钥保管好,公钥即使丢了也没有关系,公钥显然不能推出私钥。假设以后,量子技术发达了,可以通过公钥推到得到私钥,那么在比特币系统中,还需要突破另一层保护机制,就是需要能够从公钥的哈希推算出公钥,而这一点即使使用量子计算机也是无法完成的。加密跟取哈希是两种不同性质的操作,加密的目的是保证信息的安全性,以后还要解密,所以加密需要保证信息的完整性,加密过程不能丢失信息。而取哈希不一样,取哈希一般情况下会造成信息的损失,哈希函数一般都是不可逆的,从哈希值是无法得到原来的输入的。 ??比特币系统中哈希函数用的是SHA-256,即无论输入有多大,输出的都是256位的,这种情况如果可逆就会变成一个超级无敌的压缩算法。所以,如果仅用来收钱的情况下,不建议把公钥暴露在比特币系统上,收钱的时候只需要提供公钥的哈希提供的地址就可以,取钱的时候才需要提供公钥,取钱的交易中需要公钥和由私钥产生的签名。如果一个人想要偷A账户上的钱,他需要在A发布交易时实时破解从A的公钥推导出A的私钥,再实时产生一个跟A的交易竞争的交易。即使这个人具有量子计算技术也很难在几分钟之内就将私钥破解,而且他发布的交易还需要抢在A发布交易的前面,因为如果在A发布交易之后,就会产生Double Spending。所以从比特币安全的角度来看,比特币系统中每个账户只取一次钱,花不完的钱转给自己的其他账户,这样做既提升了安全性,也提高了隐私保护的程度。
|