精华内容
下载资源
问答
  • 区块链的基本原理
    千次阅读
    2019-02-24 21:12:00

    简单区块链系统实现之原理讲解

    一个简单的区块链模型,学习区块链的笔记,使用python3 实现了区块链的基本原理。使用Flask 构建 peer to peer 网络,项目地址

    简单区块链系统实现之程序开发

    简单区块链系统实现之程序运行

    完整项目地址

    比特币简介:

    • 比特币是一种基于分布式网络的数字货币。比特币系统(广义的比特币)是用来构建这种数字货币的网络系统,是一个分布式的点对点网络系统。

    • 比特币底层的技术:点对点网络,时间戳,加密技术,工作量证明,共识机制不仅可以用于比特币系统,还可以用于其他领域,比特币底层技术的集合称为区块链技术,可见,区块链是一系列技术的集合。

    • 比特币不等于区块链,区块链开发也不等于就是炒币

    • 比特币又称为区块链1.0,是区块链的典型应用。

    比特币运行原理

    区块链记账方法

    假设有一个账单交易记录如下:

    账号入账出账余额备注说明
    王炸100190收到货款
    张三10030……
    李四12090170……

    记账时间为:2019-02-24 14:50:01

    区块链在记账是会把账单信息(包含账单号、记账时间、交易记录)作为原始信息进行Hash, 得到一个Hash值,如:787635ACD, 用函数表示为:

    Hash(序号0,记账时间,交易记录)=787635ACD
    

    比特币系统里约10分钟记一次账,即每个区块生成时间大概间隔10分钟

    在记第2个账单的时候,会把上一个块的Hash值和当前的账单信息一起作为原始信息进行Hash,即:

    Hash(上一个区块的Hash值,序号1,交易时间,交易记录)=456635BCD
    

    这样第2个区块不仅包含了本账页信息,还间接的包含了第一个区块的信息。依次按照此方法继续记账,则最新的区块总是间接包含了所有之前的账页信息。

    所有这些区块组合起来就形成了区块链,这样的区块链就构成了一个便于验证(只要验证最后一个区块的Hash值就相当于验证了整个账本),不可更改(任何一个交易信息的更改,会让所有之后的区块的Hash值发生变化,这样在验证时就无法通过)的总账本。

    哈希函数补充知识

    • 简介

      哈希函数:Hash(原始信息) = 摘要信息,原始信息可以是任意的信息, hash之后会得到一个简短的摘要信息

    • 特点
      • 同样的原始信息用同一个哈希函数总能得到相同的摘要信息

      • 原始信息任何微小的变化都会哈希出面目全非的摘要信息

      • 从摘要信息无法逆向推算出原始信息

    • 举例:

      Hash(张三借给李四100万,利息1%,1年后还本息 ……) = AC4635D34DEF,账本上记录了AC4635D34DEF这样一条记录。

    • 哈希函数作用

      • 简化信息:哈希后的信息变短了。

      • 标识信息:可以使用AC4635D34DEF来标识原始信息,摘要信息也称为原始信息的id。

      • 隐匿信息:账本是AC4635D34DEF这样一条记录,原始信息被隐匿。

      • 验证信息:假如李四在还款时欺骗说,张三只借给李四10万,双方可以用AC4635D34DEF来验证原始信息

    区块链工作量证明(挖矿原理)

    比特币系统记账需要把交易记录,交易时间,账本序号,上一个块的哈希值等信息计算Hash并打包,需要消耗一定计算资源个存储资源,需要付出成本,所以为了让网络可以运行,需要有一定的奖励措施,当节点完成记账工作后系统会给一定的奖励,这个奖励就是比特币的发行过程,因此形象的将记账的过程称为挖矿

    协调记账工作

    既然记账工作会有收益,那就会有很多人来争相记账,但是这样会造成记账不一致的问题,所以引入了比特币工作量证明来解决这个问题,有如下规则

    • 一段时间内(大约是十分钟左右产生一个区块) 只有一个人可以记账成功

    • 节点之间通过解决密码学难题来竞争唯一的记账权

    • 其他没有货的记账权的节点直接复制记账节点的结果并验证就好

    在进行工作量证明之前,记账节点会首先做好如下准备工作:

    • 收集广播中还没有被记录在账本中的原始交易信息

    • 检查交易是不是合法(例如一个地址不可以转比余额更大数量的比特币到其他地方)

    • 验证交易是否正确的签名

    • 验证通过的交易进行打包

    • 添加一个奖励交易给自己(比特币的发行)

    如果节点争夺记账权成功的话,就可以得到相应数量的比特币

    工作量证明

    从记账方法中可知,每次记账的时候只需要计算一个Hash值就好,只要知道了上一个块的哈希值,待挖块的交易信息就可以很快的计算出哈希值,这样没有办法争夺记账权了,为了确保十分钟左右(这与密码学问题难度有关)只有一个区块产生,必须要提高记账的难度。

    现在采取的措施是要求生成的哈希值前边有若干个连续的0,当前区块链系统中要求有18个0,在计算哈希的时候再加入一个随机数,使得哈希值满足要求,但是这个随机数是无法直接计算出来的,没有捷径可走,只能从0开始一个一个尝试,直到哈希值满足要求。率先找到满足要求的随机数的节点就获得了记账的权利

    • 难度分析:

      哈希值每一位有26个大写字母,26个小写字母,10个数字,一共有62个字符,按照每个字符出现的概率均等来计算,第一位是0的概率是1/62,18个0的概率就是18个1/62相乘,理论上需要计算62的18次方哈希才可以找出来,所以如果一个节点计算出来这个值,需要投入很大的电力和算力,现在计算出这个值太难,一般没有单独的矿工挖矿了,通过加入矿池,按照算力来分收益比较常见。

    验证

    在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。

    如果验证通过,则表明已经有节点成功解迷,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争猜谜。

    网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。

    假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。

    共识机制

    在挖矿过程中,人人都想要争夺记账权得到收益,为了确保收益的合法性,只有当一个节点的工作量证明被其他节点认同的时候才会验证通过,这个节点才会获得收益,也就是只有遵守协议才可以得到其他节点的认同,这样,促使了数以万计的节点都遵守一个简单的规则,那么这个规则就是一个共识,就是一个大家共同遵守的一个协议规范

    在没有一个中心化服务器的状况下,所有节点如何达成一个共识呢?

    实际上,比特币的共识机制由所有节点的4个独立的过程相互作用产生:

    • 每个节点(挖矿节点)依据标准对每个交易进行独立验证

    • 挖矿节点通过完成工作量证明,将交易记录独立打包进新区块

    • 每个节点独立的对新区块进行校验并组装进区块链

    • 每个节点对区块链进行独立的选择,在工作量证明机制下选择积累工作量最大的区块链就是权威的公共总账本

    前三条在工作量证明和记账工作部分已经说过,对于第四条,累计工作量最大的区块链就是最长的一个区块链,一个节点和自己的邻居节点进行数据比对,如果数据不一致,则要进行冲突的解决,最终达到和邻居节点的链数据一致的结果,当然,节点的每一个邻居节点也会做同样的操作,最终达到网络上存储的账本一致

    解决冲突可以分为以下几类:

    • 节点的链比邻居节点的链长:很好,这个节点不需要自己存储的链进行操作,只需要告诉邻居节点,哥们,你的链少东西呀,赶紧同步一下

    • 节点的链和邻居节点的链一样,啥都不用作,继续检查其他邻居节点

    • 节点比邻居节点的链短:检查邻居节点的链是不是合法的链(哈希值对不对,工作量证明对不对)链合法的话用就用邻居的链替换自己的链,否则不替换,并告诉邻居节点链错了

    共识机制的第四条保证了链条的增长只在最长的链上进行。

    更多相关内容
  • 区块链基本原理

    千次阅读 2020-03-29 01:18:42
    区块链原理 区块链 有一个一个的区块,每个区块中包括着一组交易信息,然后,每一个区块都会有一个 ID(或是一个地址),这些区块通过记录前一个区块的 ID 来形成一条链 每个块的 ID 都是通过其内容生成的 利用了...

    区块链原理

    区块链

    • 有一个一个的区块,每个区块中包括着一组交易信息,然后,每一个区块都会有一个 ID(或是一个地址),这些区块通过记录前一个区块的 ID 来形成一条链
    • 每个块的 ID 都是通过其内容生成的
      • 利用了安全哈希算法(一般使用SHA-256算法)
      • 只要是内容有一丁点儿的变化,这个 ID 都会完全不一样
        • 类似于数字签名
    • 生成 ID 的内容中还包括上一个块的 ID
      • 把本区块内容和上个区块的hash值拼到一起hash
      • 只要上一个块的内容变了,其 ID 也要跟着变,那么后面指向这个块的 ID 也要
    • 这样就会形成一个连锁效应:一个块被修改,后续的所有块都要跟着一起改。于是导致了修改成本的提升
      • 这种一处改,处处改的方式,并不代表不能篡改,而只是让修改面比较大,让你的改动麻烦一点
      • 越旧的区块的篡改会造成越大面积的修改,于是越旧的区块就不容易篡改,就越安全。反之,越新的区块就越不安

    在这里插入图片描述

    工作量证明共识机制

    • 去中心化的网络下,结点要被假设成不可信任的

      • 对应的,要解决以谁的数据为准和如何处理意见分歧的问题
    • 为了解决这几个问题,比特币使用了 Proof-of-WorkPow算法) 工作量证明机制,也就是“挖矿”

    • 所谓的 “挖矿” 其实就是用大规模的计算来找到一个符合系统要求的区块 ID

      • 要找到符合条件的区块 ID 只能通过暴力穷举的方式,所以要付出大量的系统计算资源和电力
      • 使用 " 挖矿 " 机制,可以大幅度提高想要通过修改和攻击这个系统的人的成本
    • 功能

      • 修改几乎变得不可能
        • 如果你要伪造一个块,那么你就要修改后面所有的块,修改一个块的成本如此之高,那么修改整个链的成本也就非常之高了
      • 解决分歧
        • 当出现多个合法区块时(ID)时,由于无法承受同时跟进多个账本的成本,所以大多数人只会跟进一个账本,此时另一个链就被放弃了
        • 因为一个分支如果长于另一个分支,较短的那个分支就会被孤立出去,其上的账本就都不作数了,而矿工的奖励也没有了
    • 符合系统要求的ID要求

      • 满足以下公式:SHA-256(SHA-256 (Block Header)) < Target
      • 挖矿就是要找到某个数字,让整个 hash 值小于 Target, 也就是哈希碰撞前几位都是0的哈希值
    • PoW算法和Raft/Paxos算法

      • 区别
        • 对于 Paxos/Raft,其需要 Leader 选举,而对于比特币或者以太坊这样的无中心化的方式是没有 leader 的
        • 对于 Paxos/Raft,加入其网络(集群)的结点前提假设都是受信的。然而,对于比特币 / 以太坊来说,其前提假设都是不受信的,它们只相信,超过一半的结点所同意的东西
        • 对于 Paxos/Raft,需要事先对整个集群中的结点数有定义,而无中心化的比特币和以太坊中的结点是想来就来,想走就走,来去自由
      • 相同
        • 都是一致性算法
        • 对系统的修改总是需要一个人来干(区块链用 PoW 消耗资源,让提案变得困难,Paxos/Raft 用领导选举)
        • 系统中暂时的不一致是可以被修正的(区块链会考虑最长链,牺牲了强一致性,保证了可用性,Paxos/Raft 如果没有超过半数的结点在线,会停止工作,牺牲了可用性,保证了强一性)
    • PoW算法最初是用来限制垃圾邮件的
      -

    比特币

    • 比特币的交易处理流程

      • 需要交易的用户把交易传到网络中
      • 网络上有些机器叫记账结点,它们通过比拼计算力的方式竞争记账权,这也叫“挖矿"
      • 获得记账权的结点,会把待记账的交易进行计算打包,并向全网广播。收到新的记账包的结点会对其进行验证,验证通过后加入自己的区块
    • 比特币的加密

      • 底层原理也是利用了密钥对和数字签名
      • 交易的发起方只能是支付方,支付方需要用自己的私钥来加密交易信息并制作相关的交易签名
      • 网络上其他人会用支付方的公钥来做解密来验证
      • 不需要证书机构以预防中间人攻击
        • 想要伪造一笔别人的交易,那么他需要换掉半数以上结点上的被攻击者的公钥,这不太现实
    • 如果你的比特币的私匙被盗,相当于你的钱被盗了,区块链只认私匙,不认人
      在这里插入图片描述

    • 比特币地址

      • 比特币地址(例如:1LVL7K3SNwZr7hUhBXrDYzx83mzL5h5eLt)由一串字符和数字组成,由公钥经过单向的加密哈希算法得到,相当于收款账户,类似于 email 地址
      • 不同的数字货币有自己的地址体系,互相之间不能共用
    • 比特币交易

      • 一笔交易是指把比特币从一个地址转移到另一个地址
        • 更精确地,一笔“交易”指一个经过签名运算的、表达价值转移的数据结构
        • 任何一笔交易的都附有交易费,意在通过对每一笔交易收取小额费用来防止对系统的滥用
      • 交易手续费
        • 在发送比特币到另一地址时需要用户设定的支付给矿工的比特币数量,一般根据比特币网络中的市场力量动态确定。一笔交易的交易费越高,越可能被矿工优先处理
      • 发起交易
        • A 用自己的私钥为交易信息和自己的地址生成了交易的签名,然后把交易信息、自己的地址、交易签名和自己的公钥放出去,这样方便别人来验证的确是 A 发起的
      • 验证交易
        • 在验证时,使用 A 的公钥解密交易签名,得到交易的 hash 值。把交易信息和自己的地址做 hash,看看是不是和签名解密后的 hash 值一致
    • 区块

      • 每一笔“交易”都经过比特币网络广播和传输,由矿工节点收集并封包至区块中,永久保存在区块链某处。要确认一笔交易,一个交易必须包含在一个区块中,并被添加到区块链中
      • 一个区块(Block)就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记
      • 网络每10分钟生成一个区块,称为出块速度
        • 是比特币的发行速率和交易达成的基准参
      • 区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易
      • 所有的区块按时间顺序串联起来,形成区块链(Blockchain)
    • 挖矿流程

      • 从网络上取得之前的区块信息
      • 从 " 待记账区 " 中获取一组交易数据(有优先级,比如成长时间、矿工小费等)
      • 形成区块头(计算 Merkle Root 并设计记账时间 Timestamp 等)
      • 开始穷举 Nonce,来计算区块头的 hash 值。如果前面有 18 个零(小于 Target),那么记账成功。如果没有,则从第一步重新开始
      • 一旦某矿工成功打包一个区块,他就会告诉其他矿工。收到消息的矿工会停下手上的工作,开始验证,验证通过后,广播给其他矿工
    • 满足符合系统要求条件的这个难度系数成为了挖矿的关键

      • 设置这个难度系数就是为了让全网产生的区域名平均在 10 分钟一块
      • 当算力不足的时候,难度下降,当算力充足的时候,难度提高
    • 面临的问题

      • 越来越中心化地记账
        • 本来是要大众一起参与去中心化的事,现在因为算力的问题,因为 GPU 的出现,导致一般人几乎无法参与其中了
      • 越来越跑不动
        • 比特币今天的链越来越长,导致要验证数据是否正确的成本越来越高,一般人的电脑基本都快要跑不起来了

    智能合约

    • 智能合约其实就是一段可执行的程序片段, 把合约代码在本地编译成功后发布到区块链上,可以理解为一个特殊的交易

      • 当需要调用这个智能合约的方法时,只需要向这个智能合约的地址发送一笔交易即可
    • 如果合约存在BUG,那么Bug 也会被残酷无情地执行,一旦执行就很难补救了

    在这里插入图片描述

    展开全文
  • 区块链原理汇总

    2022-05-13 15:00:51
    区块链基本功能是记账,特点是不可篡改。所以其创建初衷就是搞一个不能篡改的记账本,所以区块链可以分拆成2部分,即区块和链。 2.1 区块 区块可以认为是电子记账薄中的一页,如下图所示是经典的一个区块,记录...

    参考资料:https://www.jb51.net/blockchain/801891.html

    1、前言

    这几天在学习区块链相关知识,这里做下归纳和记录。

    2、什么是区块链

    区块链的基本功能是记账,特点是不可篡改。所以其创建初衷就是搞一个不能篡改的记账本,所以区块链可以分拆成2部分,即区块和链。

    2.1 区块

    区块可以认为是电子记账薄中的一页,如下图所示是经典的一个区块,记录了2笔交易。

    第一笔,Damian转出100BTC,George转入100BTC

    第二笔,Bernard转出200BTC,Gerald转入200BTC

    这2笔交易的全部字符可以看做一个长字符串,将这个长字符串做哈希计算,假设得到的值是“X32”(实际情况会很长,这里是示意),这样我们就得到了这2笔交易记录的唯一“签名”。假设现在有人要修改这笔交易记录,必然会导致签名的变化,所以只要我记住了签名就能够知道交易记录是否被篡改,但我一个个签名去记录也很费事所以又引入了“链”。

    2.2 链

    假设我们在新的区块中又记录了2笔交易,在记账时我们将上一个区块的签名一起记录,由哈希运算的特点我们知道,若区块1中的任意字符被修改,则会得到一个非“X32”的新签名值,而原区块1的签名值我们是记录在区块2中的,这样我们就非常容易发现区块1的值是否被修改过。

     

    在计算区块2的签名时,我们以“交易记录+上一个区块签名”作为字符串做哈希运算可以得到一个新的签名值,假设是“9BZ”,同时将这个签名记录到下一个区块中。

     依次类推便实现了一个“链”,这个链中任何一个区块的值都无法被篡改,因为任意的篡改都会导致当前区块计算出的签名值与下一个区块记录的签名值不一致,我们称为断链。如下图所示,对区块1的篡改就导致了区块1与区块2断链。

     3、区块链是如何完成记账的

    3.1 私钥、公钥与钱包

    一般的交易中我们需要用到“账户名、密码”比较严谨的还会用到“交易密码”,在虚拟货币交易时也是这样。要参与区块链首先你得有一个“私钥”,这个私钥其实就是一个32字节的随机数,像下面这样。

    “8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3”

    这个数是怎么来的呢?这完全看你了,你自己手写也行,摇骰子记录也行,但你自己编的很容易跟别人重复了,如果发生重复则别人就可以使用你的资产。所以一般是通过专门的随机数生成器来自动生成,这样的32字节随机数即使你生成到天荒地老很可能也难以重复出现两个一样的。一般各平台或客户端都配套有私钥生成器,大家不用操心这个。

    公钥则是基于私钥的一系列运算(公开的算法)后得到的另一个字符串,钱包账户则是基于公钥再进行一次运算(公开算法)得到。总的来说你现在得到了3个有关联关系的字符串,大概长下面这样:

    私钥:8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

    公钥:04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235

    钱包:3E1yP8eO5Wkaib7DRPsfTN9Xlmu1CizfQg

    这里面最重要的是私钥,一定要保存好了,同时也需要保密,因为公钥和钱包都是基于私钥“通过公开算法”计算得来,也就是任何人掌握了你的私钥他都可以通过这个私钥来计算出公钥和钱包,从而控制你的虚拟资产。同时要注意的是,这三个字符串都是你本地生产的,链只做记录不负责相关的“开户”工作。

    3.2 如何交易

    交易过程可以参考下图示意。

    1)交易双方达成交易后,卖出方生产一条交易记录并指明自己的钱包和接收方钱包(前面讲过的一串字符),接着卖出方需要用自己的私钥对这个交易记录进行签名(就是做一次加密计算得到一串字符),并将签名结果放到交易记录的后面(就是把那一串字符附到后面)

    2)卖方产出交易记录并签名后就将这个记录向全网广播,同时附上的还有自己的公钥(如何广播后面再讲)。

    3)链网络中的节点(就是矿工,后面讲)收到这个记录后会先存起来,每间隔10分钟有记账权力的节点会将收到的所有交易记录写到链中并向全网广播(为啥是10分钟、谁有权力记账后面讲)。

    4)不过在确认交易记录时,节点还需要对交易记录进行验证,比如用公钥检验下这个交易记录是不是真的由卖方发出的(如何检验后面说),同时还要查询下卖方是不是有这么多币可以交易。

    5)网络中其他节点收到这个广播后会在本地记录下交易记录,这样就实现了一次全网的数据同步,同时也完成了交易的确认。

    6)买卖双方这时候就能在链上查询到自己的交易记录了。

    3.3 如何知道节点的地址

    交易时我们需要知道至少一个区块链网络中的节点地址,这样才能向网络提交数据。其实比特币源代码中是直接设置了一个“初始节点”的地址,默认是一个URL的域名,如果域名失效就直接访问IP,而这个初始节点地址是可以自己改的。总的来说当时搞这个的时候是有人在推动这个事情的,所以他们推出的客户端都写好了初始节点地址,也就是他们建设和维护的节点。如果你想自己来修改这个地址也可以的,比如你认识某个节点的维护人,你填上他的地址即可。当你连上某个节点后,它就会告诉你更多的节点地址,就这样口口相传维护了庞大的节点网络。

    4、节点(矿工)是如何发挥作用的

    在区块链网络中实际上是支持2种节点:全节点、轻节点。全节点就是存有所有的交易记录,一般矿工才会维护全节点,当然你也可以做雷锋。轻节点只存最新的交易记录,并根据你的需要去同步老的数据。显然轻节点就是一般的“客户端”,全节点则是矿工,那么矿工是如何在网络中发挥作用的呢?

    4.1 节点如何记账

    前面说过区块链创建的初衷是“记账”,而记账的方式简单粗暴,就像前面描述的那样把一个个连续的“区块”存在本地,而且在收到其他节点同步过来的区块时也存起来,这样就构成了一个由节点组成的记账网络。网络中所有节点都有“全量数据”,说实话这种所谓分布式存储跟我们常说的分布式区别还蛮大的。

    4.2 奖励机制与挖矿

    由于每个节点都会存全量数据,那么很快数据量就会变的很大,存储这样的数据是需要成本的,为何节点愿意存呢?因为有一个独特的奖励机制,即每10分钟,第一个获得了记账权的节点会获得50个比特币的奖励(最开始是50,每4年减半,后面说)。

    这么看网络中的所有节点都想来第一个记账对吧,那怎么来分配这个机会呢?区块链的发明者想到一个很有趣的方法,还记得前面我们讲的区块如何成链的吗,其实没讲全,在一个新的区块(Block3)被记录时,其实还有一个要求。

    那就是在计算出Block2签名“9BZ”后,不是直接写到Block3中的,而是需要你随机生成一个数nonce,当这个nonce+9BZ(Block2的签名)形成的字符串经过哈希计算的结果符合下面特定要求才获得了写Block3的权力。

    这个特定要求就是“哈希计算的结果要以不少于N个0为开头”,且这个N值是自动调节的(后面讲网络是如何调整N值),比如当N是10时,你哈希计算的结果必须要像下面这样:

    “00000000006E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3”

    这看上去就很难,因为哈希计算的结果是随机的,而且随机数的数量突破天际。你需要不停修改nonce的值然后做哈希运算,最后撞大运得到了一个10个0开头的字符串,恭喜你获得了记账的权利。当你成功记账后网络就会奖励你50个比特币,这个过程就是所谓的挖矿,所以我们才说节点的维护者都是矿工。

    前面提到过买卖达成交易后会由卖家产生一个交易记录向全网广播,所有节点都会收到,收到后先存在本地,当某个矿工得到了那个特定nonce后,他就会将收到的交易记录写到下一个区块中并向全网广播,其他节点收到广播后会做验证,验证通过后,所有节点再以最新的区块为基础寻找下一个nonce。

    4.3 为什么是10分钟

    10分钟只是个目标时间,我们知道全网的算力是动态的,节点的数量越多则算力越大,那么找到nonce的速度也就越快。为了实现10分钟记账一次这个目标,区块链采用调节0的数量来控制。前面讲过nonce+9BZ(Block2的签名)哈希计算的结果需要满足特定条件“哈希计算的结果要以不少于N个0为开头”。很明显这个N越小(0的数量越少)则难度越低,N越大(0的数量越多)难度越大,所以每次全网同步区块时还会评估当前全网的算力(就是看是不是算的太快了),如果感觉算力太多就会提高N的值,以此来控制记账时间间隔。

    4.4 公钥检验原理

    前面我们说过“开户”其实就是你自己生成一个私钥,再基于私钥生成公钥和钱包。在你向矿工发送交易记录时,会有如下过程:

    1)假设你的私钥是“QWER”、公钥是“ASDF”、钱包是“AAA”、对手钱包是“BBB”

    2)你本地产生交易记录,假设是 “AAA转出100,BBB转入100”

    2)使用私钥对交易记录进行签名,其实就是做了一次加密运算(类似哈希那样将字符串转变为一串随机数),假设签名的结果是“SDADKJHKJGS”

    3)将交易记录、签名、公钥发给矿工

    4)矿工得到的记录大概长这样:

      AAA转出100,BBB转入100(交易记录);SDADKJHKJGS(签名);ASDF(公钥)

    5)矿工使用你的公钥对签名进行解签(又是一顿字符操作),可以得到解签的结果比如说是“AAA转出100,BBB转入100”

    6)矿工解签得到的结果与你发送的交易记录结果一致,那就证明了这个交易记录确实是你发的

    矿工为什么可以通过解签确认这个记录是你发的呢?

    假设你现在的钱包账户是BBB,你想要伪造一个AAA转给BBB的记录,但是你没有AAA的私钥,假设你随便捏造了一个私钥“QWER-2”,并依据这个私钥产生了公钥“ASDF-2”。

    使用捏造的私钥“QWER-2”对交易记录的签名结果是“SDADKJHKJGS-2”。

    矿工使用公钥“ASDF-2”确实也可以对“SDADKJHKJGS-2”进行解签,解签的结果就是“AAA转出100,BBB转入100”。

    但问题矿工使用公钥“ASDF-2”得到的钱包账号不可能是AAA,所以你的计划破产,这条交易记录被抛弃。

    4.5 矿工如何知道你有没有足够的币可以卖

    因为记账(挖矿)模式的特性,矿工处始终会存有最新最全的区块信息,所以他可以对以往的交易记录做一次全量查询来确认你是否有足够的币。其他收到新区块的节点也可以这样做,完成校验后才是真正对交易记录的确认。

    5、什么是6次确认

    当你将交易记录发给矿工后,他先是存在本地(因为他还没有获得记账权),假设现在全网都收到了你提交的交易记录,都存在本地了。这时候某一个矿工A成功获得记账权(找到了那个10个0开头的字符串),他会将你的交易记录写入下一个区块,同时将找到的nonce和新区块信息向全网广播,其他矿工收到后会对nonce进行验证,验证OK就把这个新区块记录到本地存的链上,如果校验未通过会抛弃这个新区块,这个过程就是投票。一般来说我们认为这个过程应该是顺利的,但是保不齐有坏人,这就可能导致链的分叉。

    比如某个矿工B不承认你的结果,而他自己找到了一个新的结果,他也向全网广播,这样就可能一部分节点收到了A区块的,一部分节点收到了B区块的。这时候怎么办呢?啥也不办,大家继续埋头挖矿。但链确实是产生了2个分支,我们把有你的交易记录的链称为A分支,没有你交易记录的链称为B分支,全网中各有一部分节点支持A或B。

    假设现在B分支下某个矿工成功找到了新的nonce并向全网广播,由于B分支现在比A分支更长,这样全网都会以最长的链作为标准,也就是认可B分支抛弃A分支。

    那么结果就是你写下的交易记录也被抛弃了。所以默认需要进过6次确认才稳妥,所谓6次不是6个节点或全网进行6次重复的确认,而是链新增了6次新的区块,这样即使产生了链的分叉,你的交易记录被写入链中也基本是无法更改的了。相对应的,如果链新增的区块数比较少,你的交易记录是有可能被抛弃的。当然6这个数也不是绝对的,有时候3次确认也OK,看你自己了。

    此外能够看出由于每10分钟产生一个新区块,产生6个新区块你的记录才能稳妥(60分钟),这速度着实是慢了点。

    6、手续费

    前面讲过矿工通过获得记账权来收获比特币,但我们又知道比特币的总数是2100W,而且生产的速度会越来越慢(后面讲为啥),那早晚有一天会被挖完到时候没有人挖矿,也没有人有动力来记账,整个区块链网络岂不就废了?

    所以还有个补充机制,那就是手续费。获得记账权的矿工除了直接获得奖励外,还能收到写交易记录需求方提供的手续费,比如你需要卖币给某人,想要矿工们帮你记录下这个交易记录,你得付出一定的币。

    那这里又产生了一个知识点,其实一个区块的大小是1MB,大概能够记录2000-3000条交易记录,所以一个矿工奋力挖矿10分钟,撞大运获得了记账权,他只能记录2000多个交易记录。但全网的交易是比较活跃的,10分钟可能就有上万笔记录需求,这时候咋办?

    很简单,谁给的手续费多我就记录谁。所以又产生了一个问题,那就是排队,你给的手续费少了就得排队,没有手续费可能就排到天荒地老也没人给你记录。

    7、2100W与减半机制

    2100W这个总数是写在源代码内的,现在链中的节点那么多,想改大这个数几乎不可能(得所有节点同意,否则会产生分支链)。

    另外前面提到成功获得记账权的矿工会被奖励50个币,但随着挖出的币越来越多,达到某个量后奖励会减半,因为大概每10分钟就挖出一次币,可以简单算出每4年奖励就减半这个机制。

    所以奖励是50、25、12.5.。。。依次变小一直到几乎没有,也就是挖矿不再有收益了。这个最终时间也算出来了,就是 2140 前后。

    不过到时矿工还是继续挖矿,不是还有手续费嘛。

    8、区块大小1MB能改吗

    可以改,但是得全网同意,如果有人改了有人没改,那就会导致链分叉,事实上任何对协议的修改都可能产生分叉。比较有名的就是BCH,当时就是为了对区块进行扩容,大部分人不同意,同意的人自己开了新的分叉就是BCH。

    9、比特币的最小分割单位

    最小分割单位是1聪(就是中本聪的简称),1BTC=1亿聪,所以我们可以知道BTC的容量其实是2100万亿聪,这样看起来远没有2100万那么稀缺了。

    10、总结

    总的来说,区块链是一个多中心的记账系统,我觉得多中心比分布式能更准确描述这个架构,因为每个节点都是全量存储的,所以每一个节点就是一个中心。

    使用了私钥、公钥、钱包来实现全流程的加密。

    这个系统的记账频率是10分钟,为调节这个频率引入了nonce找特定数机制。

    为鼓励大家来参与记账,引入了记账后奖励比特币的机制。

    为避免比特币无限量增加,引入了2100万总数机制。

    为避免几天就把币挖完了,引入了每4年奖励减半机制。

    为避免2100万不够用,又引入了1亿聪等于1比特币的细分机制。

    展开全文
  • 区块链与普通链表的区别在于,将普通指针替换为Hash指针。 区块链中第一个区块被称为创世纪块,最后一个区块被成为most recent block。每个区块都有一个hash指针。 hash指针的hash值使用前面区块的所有内容(包括...

    Hash指针

    hash指针保存了结构体的指针和hash值,能够用于找到结构体的位置,并且验证结构体是否被篡改。

    区块链与普通链表的区别在于,将普通指针替换为Hash指针。

    区块链中第一个区块被称为创世纪块,最后一个区块被成为most recent block。每个区块都有一个hash指针。

    hash指针的hash值使用前面区块的所有内容(包括hash指针)取hash值。

    只要保存最后一个区块的hash值,就可以确定区块链中是否被篡改。

    Merkle Tree

    用Hash指针代替普通指针的B树。最下面一层(树的叶子节点)是数据块,树的内部节点都是Hash值。

    比特币区块的交易用Merkle Tree的形式保存。

    block header 存放 Merkle Tree的root hash值,block body存放交易。

    Merkle Tree的作用在于提供Merkle proof。全节点保存blocker header和block body,而轻节点保存block header。比特币区块的数据结构示意图
    要验证交易保存在区块中,只要计算对应交易的hash值,一直向上到根节点,验证根节点hash值是否正确,就可以进行merkle proof。

    如果要篡改交易,其难度与制造hash碰撞相同,难以实现。

    • proof of membership: 时间复杂度 O ( l o g n ) O(logn) O(logn)
    • proof of non-membership: 需要对交易的hash值进行排序,此时可以 O ( l o g n ) O(logn) O(logn) 进行查询。

    注意

    hash指针的使用不适用于有环的情况。

    展开全文
  • 认识区块链,让我们从最开始的比特币开始。 比特币本质上来讲,是一个全球统一的分布式账本,记录着所有的交易记录。只要根据你所有的交易记录,就能知道你现在有多少钱了。 弄一个账本很简单,但是要让全世界都...
  • 本系列内容包含:基本概念及原理、密码学、共识算法、钱包及节点原理、挖矿原理及实现。 1. 概述 区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,或称之为公共账本,其每一个区块记录一段时间内...
  • 区块链基本原理系列: Part-1:拜占庭容错Part-2:工作量证明和权益证明 一段时间以前,我们讨论了共识机制的工作方式(即本系列 Part-1)并了解了工作量证明(PoW)和权益证明(PoS)的基础(即本系列 Part-2)...
  • 区块链基本概念和工作原理

    万次阅读 多人点赞 2018-06-26 17:14:43
    区块链基本概念和工作原理1、基本概念区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。区块链...
  • 区块链技术基本原理

    千次阅读 2020-12-02 10:12:59
    区块链技术基本原理要理解清楚就必须去深入的了解它,区块链技术基本原理也是随着各方面的应用而越来越清晰,区块链概念在国内逐渐热了起来。具有去中心化、无须中心信任、不可篡改和加密安全特点的区块链技术正在...
  • 区块链本质上是分布式系统,其中包含不同的参与者,基于各自动机和可用信息行动。 每当一笔新交易在网络中广播出来,节点有权选择将该交易纳入其持有的账本副本之中,或者将其忽略。当网络中的大部分参与者选定某一...
  • 在第一节中,我们探讨了拜占庭将军问题的概念,如何实现拜占庭容错,以及二者与区块链之间的关系。 上一篇文章中提到的算法实际上是实现拜占庭容错的一种解决方案。然而,该方案还不够有效,其变化方案又存在局限性...
  • 一文弄懂区块链技术原理

    千次阅读 2021-07-20 22:42:09
    近期由于工作需要,于是对区块链相关技术展开了大量的研究和学习.本文将以开发者的角度,对整个区块链行业技术的发展做一次全面的总结和归纳. 文章宗旨是为了帮助大家理解区块链技术出现的目的、能够解决什么问题还有...
  • 这一系列文章主要是自己学习区块链的一个记录,没基础又对区块链感兴趣的朋友可以看看。 This series of articles are mainly about my own experience in studying Blockchain, whoever interested in it could ...
  • 区块链基本原理--如何建立去中心化

    千次阅读 2016-06-08 18:09:00
    账本结构: 共识机制: 工作量证明机制(Proof ...做法是将交易资料经由数位签章加密并经由Hash函数得出一串代表此交易的唯一Hash值后,再将这个Hash值广播(Broadcast)给比特币区块链网络中的其它参与节点进行验证。
  • 区块链的核心技术原理和特征分析

    千次阅读 2018-08-21 16:20:46
    文章提出,希望可以创建一套新型的电子支付系统,这套系统“基于密码学原理而不是基于信用,使得任何达成一致的双方能够直接进行支付,从而不需要第三方中介参与”。2009年1月3日,区块链的第一个区块诞生,该区块又...
  • 区块链底层算法逻辑探究
  • 区块链技术原理

    2017-08-30 15:53:34
    区块链技术原理 2016-07-17 17:48 12278人阅读 评论(5) 收藏 举报 目录(?)[+]  区块链是什么 核心技术1区块链 核心技术2分布式结构开源的去中心化的协议 核心技术3非对称加密算法 核心技术4脚本 ...
  • 关于比特币 为什么要探讨比特币?...所以作为区块链技术的第一个成功应用,要探讨区块链技术大概是绕不开它的。这篇文章只是给大家一个初步的概念,相关内容我会在后面会详细点和大家讲。 Why should we disc...
  • 区块链技术原理精讲

    千人学习 2019-12-16 10:49:04
    并针对常听到的一些区块链基本问题做了详细的原理解释. (另外由于本人第一次录制视频课程,对于视频内容讲解可能不够到位,大家在学习课程中有任何问题或者觉得讲的不够细致的都可以在评论中提出来,我会追加成新的...
  • 关于数字签名 "数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么?  帐本和电子签名,一本公共帐本是个很简单的支付系统 , 协议看起来是这样的,谁都能在帐本...
  • 而为了保证比特币的流通能够正常的进行,比特币软件必须提供一些最基本的安全上的保证。比如说,如果A给了你一个比特币,这一个比特币就是你的了。要是A能随随便便把这个比特币抢回去,那肯定不行。 如果你使用的是...
  • 区块链运行原理

    2019-11-07 23:05:53
    区块链的工作流程 严格来讲,区块链是一种信息组织结构,我们不妨将其看作是一条由存有交易信息的各个区块按照交易发生的时间先后顺序...以比特币为例,作为区块链基本结构单元,区块由包含元数据的区块头和一系...
  • 区块链技术原理简介

    千次阅读 2018-04-12 22:05:54
    一、区块链最主要的技术特点:去中心化、不可篡改、可追溯。 1)去中心化。在区块链的网络中分布着众多的节点,节点和节点之间地位平等,可以自由连接进行数据交换,不存在中心节点。所谓的去中心化和传统的分布式...
  • 区块链的技术原理

    千次阅读 2021-09-07 11:11:37
    本文如图3.1所示,区块链基础架构模型可以分为六层...在这一层设计了区块链的数据结构,描述了区块链中底层的组成原理。每个数据区块一般包括区块头和区块体两部分,区块头中存储如图3.2中六部分内容,区块体中存储了此
  • 区块链挖矿原理

    千次阅读 多人点赞 2018-03-31 13:28:43
    区块链挖矿原理 目录 区块链挖矿原理 目录 导言 1.ICO 2.数字货币的发行模式 3.挖矿原理 3.1工作量证明函数 3.2区块 3.3难度值 3.4工作量证明的过程 导言 提起比特币和区块链,很多人都觉得...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,629
精华内容 5,051
关键字:

区块链的基本原理