3.4 以太坊架构详解

1.以太坊总体架构 

  1. 以太坊详细架构 
    1. 账户设计 
      1. 外部账户:一般意义上的账户
      2. 合约账户:它是一种可编程的账户,合约存在以太坊的区块链上,它是代码和数据的集合。合约受代码控制并由外部所有账户激活
      3. 在以太坊中,区块链被作为一个通用的管理对象状态转换的去中心化平台,账户就是有状态的对象。外部所有账户的状态就是余额,而合约账户的状态可以是余额、代码执行情况,以及合约的存储。以太坊网络的状态就是所有账户的状态,该状态由每个区块的交易来更新,同时需要在全网形成共识。用户和以太坊的交互需要通过对账户的交易来实现。
      4. 以太坊外部账户由公、私钥对定义。地址是公钥的后20位
      5. 密钥文件存储在以太坊的数据目录中的keystore目录下面
      6. 合约账户可以执行图录完备的计算任务,也可以在合约账户之间传递消息,合约编译成以太坊虚拟机字节码,记录在区块链上面 。
    2. 区块链设计 
      1. 以太坊区块链的每个区块不仅保存着交易清单,还保存着最新的状态。
      2. 以太坊的状态包含了一个键值表,键是地址(address),值是账户里声明的所有变量,包括余额,随机数,代码和账户的存储(存储也是以一颗树的形式来组织)
      3. 对于以太坊的Merkel-Patricia树,键被编码成向下访问树的
      4. 在以太坊区块链的区块报文头中,存放了3个根哈希:Merkel根哈希值,状态的根哈希值,收据的根哈希值
    3. POW机制 
      1. 以太坊的POW算法叫做Ethash算法,该算法主要寻找一个随机数作为输入,使得运算结果小于一个特定的难度门槛。
      2. 以太坊通过动态调节难度来达到平均15秒在全网中找到一个新的区块。每15秒的“心跳”基本上是全网更新系统状态的节奏,并保证当攻击者的计算能力不超过全网计算能力的一半时,攻击者无法改写交易记录或进行分叉。
      3. 以太坊的POW中加入了内存难度,使得仅仅依靠算力来进行挖矿的方式行不通
      4. 叔区块:批符合难度条件,但是区块里的交易不被确认的区块。
      5. 每个区块最多能链接两个叔区块
    4. 计算和图录完备 
      1. 以太坊的计算环境是图录完备的
    5. EVM高级语言 
      1. Solidity
      2. Serpent
      3. LLL
    6. 以太坊P2P网络 
      1. RLPx协议 
        1. 以太坊网络节点间的通信采用P2P线上协议。节点间采用RLPx编码及认证的通信传输协议来传输消息包,即提供 发送和接收消息的协议功能。
        2. 节点可以自由的在任何TCP商品发布和接受连接,默认的商品是30303.
        3. 正式版RLPx功能如下: 
          1. 单一协议的UDP节点发现
          2. ECDSA签名的UDP
          3. 加密握手、认证
          4. 节点持久性
          5. 加密/认证TCP
          6. TCP帧处理
        4. P2P节点采用RLPx的发现协议DHT来实现邻节点的发现。
        5. RLP(递归长度前缀):将二进制的数据进行任意嵌套的数组编码。在以太坊中,RLP是对对象编码的主要方法
      2. Whisper协议 
        1. 它是DAPP之间通信的通信协议。
        2. Whisper结合了DHT和数据包消息系统(如UDP),因此同时具有两种协议的特性。
        3. Whisper是一个线标志的消息系统,提供了一个低层次但又简易使用的API,不需要记忆底层的硬件属性。
        4. Whisper提供多索引,非单一的记录,也就是说同一个记录可以有多个键,不同键之间的记录可能是一样的
        5. Whisper是为需要大规模的多对多数据发现,信号谈判,最少的传输通信,完全的隐私保护的下一代DAPP而设计的
        6. 使用场景 
          1. DAPP需要把少量的信息发送出去,而这些发布的消息需要保留相当一段时间
          2. DAPP需要把信号发给其它的DAPP,希望他们参与对某个交易的协同
          3. DAPP之间需要提供非实时的提示或通信
          4. DAPP需要提供暗通信,也就是通信双方除了知道对方的哈希值之外,不知道对方更多的底细。
    7. 事件 
      1. 以太坊中的事件是一个以太坊日志和事件监测协议的抽象 。
      2. 日志记录提供合约的地址
      3. 事件则利用现有的ABI功能来解析日志记录

 

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值