比特币中有两种节点,一种是全节点,一种是轻节点
比特币网络中大部分节点都是轻节点,如果只转账不挖矿,那么运行一个轻节点就可以了。在挖矿过程中,如果你监听到别人发布了一个区块,这个区块是合法的,这时候你应该停止已有的挖矿,然后重新在本地重新组织一个候选区块,重新进行挖矿。为什么?因为你要沿着新发布的区块往下接着挖的话,本地所组装的区块中包含的交易就会发生变化,有些交易可能已经被包含到新发布的区块里面了,另外block header内容也会变化,像merkle root,指向前一个区块的指针,所以要在本地重新组织一个候选区块,重新进行挖矿。这样做是否可惜?不可惜,因为挖矿是无记忆性的,所以无论继续挖原来的区块,还是停下来改成新区块,成功的概率是一样的,只要当前还没有挖到符合要求的nonce值,前面已经挖了多少和结果没有关系。即使挖到了合法区块,发布出去,也不是说就成功了,有可能发布的区块最终不在最长合法链上。
比特如何保证安全?
一方面是密码学的保证,一方面是共识机制
别人没有你的私钥就没有办法伪造你的签名,所以不能转走你账上的钱,注意,前提是系统中拥有大多数算力的矿工是好的,是遵守协议的,不会接受那些没有合法签名的交易,如果没有这点,密码学上的保证就没有用武之地。比如,你去银行取钱,按照规定,取钱得出示合法证件,银行工作人员才能给你钱,这个合法证明就相当于密码学上的签名,密码学的性质保证别人没有办法伪造你的签名,也就没有办法伪造你的身份。所以,产生私钥的时候要有好的随机源,产生的随机数要足够随机,但是光有这点也是不够的,银行的工作人员也要遵守规定,不会把钱交给没有合法证件的人, 只有这两条合在一起才能保证别人不能转走你的钱。
挖矿的设备第一代设备是用CPU去挖矿,但是单独买一台计算机去挖矿是很浪费的,计算机大部分内存都是闲置的,挖矿只用到其中很小一部分内存,硬盘和其它资源都是限制的,CPU当中大部分的部件也是闲置的,因为挖矿当中计算hash的操作只用到了通用CPU中很小一部分指令,所以随着比特币挖矿难度的增加,用通用计算机去挖矿已经变得无利可图了。
第二代设备是用GPU去挖矿,GPU挖矿比CPU挖矿效率提高很多,GPU主要用于大规模的并行计算,但是GPU用来挖矿其实还是浪费,因为GPU是为了通用并行计算而设计的,用来挖矿的话仍然有很多部件处于闲置,比如说用于浮点数运算的那些部件,这些部件对于深度学习来说是很重要的,但是比特币的挖矿只用到了整数操作,所以GPU挖矿效率比CPU高但仍然有不少浪费。
第三代设备是用ASIC芯片去挖矿,这是专门为挖矿设计的芯片,上面没有多余的电路逻辑,整个芯片就是为了比特币挖矿计算hash而设计的,它的性价比是最高的,而且为某一种加密货币设计的ASIC芯片只能挖这一种加密货币,挖别的就不行,除非用同一个mining puzzle。
总的演化趋势是通用计算→通用并行计算→挖矿专用
挖矿另一个趋势是大型矿池的出现
单个矿工即使用了ASIC芯片,挖矿从平均收益上来看是有利可图的,但是收入是非常不稳定的,因为比特币系统平均10分钟产生一个区块,这是针对所有矿工而言。具体到某一个矿工,他可能要很长时间才能挖到一个区块。单个矿工还有另外一个问题,他除了挖矿还要承担全节点的其它责任,那怎么办?矿池在这种情况下诞生了。所谓的矿池就是把这些矿工组织起来,矿池的架构通常是一个全节点驱动许多矿机,一个矿池有一个矿主(pool manager),下面有许多矿工(miner),矿工只负责计算hash,全节点的其它职责都用矿主承担。矿池的出现还有另外一个目的,解决收入不稳定的问题,大家一起干,挖到矿了大家按工作量分,工作量如何证明?原来矿工要找到一个nonce使得block header 的hash值前面至少70个0是合法的,现在我们降低挖矿难度,比如说前面60个0即可,这样挖到的叫一个share,也叫almost valid block,矿工挖到这样的share后把它提交给矿主,矿主拿到这个区块没有任何用处,除了作为矿工的工作量证明。等到某个矿工真正挖到了区块,按照提交的share数量进行分红。
这里有一个问题,矿工会不不把挖到的share全部提交给了矿主,而挖到的真正区块自己发布了?这是不可能的,因为每个矿工的任务是矿主分配的,矿主组装好一个区块,然后交给矿工尝试各种nonce,光是调整nonce是不够的,还要调整coinbase域,所以矿主把不同的coinbase域所对应的不同nonce范围交给不同矿工去尝试。区块里面的coinbase-transaction(铸币交易)里面包含收款人地址,这个地址填的是矿主的地址,所以矿工挖到区块之后不提交给矿主是没用的。
还有一个问题是矿工有没有可能捣乱,比如说平时挖到的share给矿主,等到挖到真的区块,把它扔掉。这种情况是有可能,但是这对于个人来说并没有任何好处。唯一的好处是,矿池之间是存在竞争的,矿池可以派一些矿工去别的矿池捣乱。