哈希函数有几个特点
- 输入值稍微变化后,结果就会有很大的不同,完全无法预测不同输入间的规律
- 逆向计算不可行,只能使用试错法(穷举法),解空间2^256
每一个小账本被称为区块,每一个不同的区块链协议(产生不同的加密货币)都会规定每一个区块的大小(最初比特币为1M)
账本组成区块,区块构成链表,区块的头包含前一块的哈希值,这就是区块链
任何人不能随意修改其中的内容,或者交换顺序 。如果你这么做,意味着 你需要重新计算所有的特殊数字- 【网络路由节点】使得节点具有参与验证并传播交易与区块信息,发现监听并维持点对点的链接的能力
- 【完整区块链】具有此模块的节点被称为:全节点。它能够独自自主的校验所有交易,不需要任何其他信息。
- 【钱包】比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的,数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。有些节点仅仅保留区块链的一部分,通过一种”简易支付验证“(SPV Simplified Payment Verification)的方法来完成交易
- 【矿工】挖矿节点以相互竞争的方式创造新的区块。有一些挖矿节点也是全节点,可以独立挖矿;还有一些参与矿池挖矿的节点是轻量级节点,必须依赖矿池服务器维护全节点进行工作
抛开代码算法层面来说,实现方法就是通过找前n
位是0的方法。从概率角度来说,n值越大,意味找到这个这个数的解范围越小。
随着需求0
的数目一个一个增加,需要的计算时间将会程指数增长。
难度调整方式
难度的调整实在每个完整节点中自动发生的。如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。
例如比特币中的是这样定义的:每2016个区块后计算生成它们花费的时长,比上20160(14天)调整一次。有人可能会问,如果在这十四天内计算能力暴涨怎么办,其实这个10分钟的区块新建间隔的规定也只是一个估计要求,真实情况下,这个时间会偏离10分钟这个设定值很多,但是这种偏差并不会对整个区块链的运行产生影响
但是有人会问,这个过程是靠脚本(代码)来实现的,还是自己手动调整的呢?答案是,本地挖矿节点根据自己看到的链上信息自己调整。
问题又来了,为何我不自己降低难度,让自己更加容易新建区块呢?其实,因为链上所有节点确认新的区块(只有确认了你才能得到回报)是按照最长链并且计算难度最大来判断的,你如果用很小的难度新加的区块,是肯定跑不赢全网的其他矿工的
一笔比特币交易是一个含有输入值和输出值的数据结构。该数据结构包含了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。比特币交易的输入值和输出值与账号或者身份信息无关。可以把它理解为一种被特定秘密信息锁定的一定数量的比特币。只有拥有者或者知道这个秘密信息的人可以解锁
比特币交易的基本单位是未经使用的一个交易输出,简称UTXO(unspent transaction outputs)
对于UTXO来说,它的面值可以是一”聪“的任意倍数(1BTC等于一亿聪)但是这个有着任意面值的”人民币“不能随意打开,还被加上一道类似红包支付口令的密码,只有拥有这个密码的人才可以使用这个UTXO,UTXO包含,币值+一段代码(锁,只有有钥匙的人才能打开)
例如,你要购买3.1BTC的商品,但是你只有价值4BTC的UTXO,那么你使用4BTC时需要手动构建返还给自己的0.9BTC的UTXO,如果忘记构建,这部分BTC会被当做矿工费
每一个新建立的区块,都会有新的比特币作为奖励被产生,这个交易是一个特殊交易,被称为创币交易(Coinbase奖励)
7)Merkle树
Merkle树是一种哈希二叉树,它可以用来进行快速查找和检验大规模数据完整性。对于比特币网络来说,使用Merkle树来存储交易信息的目的是为了高效的查找和校验某笔交易的信息是否存在
叶子节点必须是偶数(平衡树),如果遇到奇数的情况,把最后一个节点自身复制一个,凑偶