ethereum-theory

区块链核心理论

账本(Ledger)

  1. 账本记录如:
    • A pays B ¥40
    • C pays A ¥60
    • ……
  2. 记录可伪造,所以需要加签名
    • 非对称加密:公钥(pk)和私钥(sk)
    • 用户帐号:Acc(pk)=Account
    • 签名:Sign(Message,sk)=Signature,将签名放到账本记录上
    • 签名验证:Verify(Message,Signature,pk) = T/F,公钥解密签名,得到的Message HASH值并与账本记录Message做HASH比较。
    • 签名使用AES-256
  3. 记录可复制
    • 给每条记录添加一个唯一编号
  4. 不足扣则不记录
  5. 最终账本记录如下:
      1. A pays B ¥40 (A’s Signature)
      1. C pays A ¥60 (C’s Signature)

去中心化

  1. P2P 网络
  2. 工作量证明机制(PoW,Proof of Work)
    1. 算法:SHA256(Message,RandomValue)=HashValue,改变Message的一小部份,则HashValue完全不一样,它具有散列性和不可预测性,且无法逆向。HashValue长度256位。
    2. 工作量:当RandomValue不同时,HashValue完全不一样,而区块链协议要求算出的区块的HashValue前30位为0(即尝试10E次),且随着时间,这个值会变大,则更加难易计算。
    3. P2P网络中的所有节点信任这个算法,这算法即共识算法。那么这个按此算法产生的区块整个网络都认可。
    4. 区块创建者会得到一笔奖励,起初是50,后续逐渐减半减少,减少到0为止。以BTC举例
      • 09.01 - 12.11 50BTC
      • 12.11 - 16.07 25BTC
      • 16.07 - 20.02 12.5BTC
      • 20.02 - 23.09 6.25BTC
    5. 区块产生时间:
      • BTC:10min
      • ETH:15sec
      • XRP:3.5sec
      • LTC:2.5min
  3. 账本一旦写入不能被修改。
    1. 所有区块使用默克尔树连接在一起,新的区块在后面,则导致整个区块不能修改。
  4. 当有两个或者多个节点创建出区块时,都添加到上一区块上,导致区块分叉。分叉后以区块链长的分支为准,同时取消掉其他分支。
  5. 伪造账单,会导致区块链分叉。但如果算力小于整个网络的50%,那么最终会被正确的区块链取消。

以太坊核心概念

智能合约

  1. 一个合约是一个帐号,它成为消息的目标,那么合约就会被调用。调用者可以是外部帐号,也可以是其他合约帐号。
  2. 合约代码运行在EVM上,并分布到整个网络每个节点
  3. 合约代码一旦发布,不可变,且永久存在
  4. 合约代码过程中状态的存储,是不可变的
  5. 智能合约开发语言:
    1. Solidity,类JS语言,其开发的合约可以用Remix IDE快速验证。官方推荐。
    2. LLL,类Lisp语言,与Solidity同一仓库
    3. Serpent,类Python语言
  6. 智能合约最佳实践

DApp

  1. 定义:相当于C/S或B/S结构中的S端,一部分放在以太坊上,由运行于以太坊网络上一个或多个智能合约的组成;另一部分可以是我们现在意义上的服务端。
  2. DApp并不把所有的状态都存储在区块链上,也不把所有的计算都放在区块链上,不然话费的Gas量太大。只把大家需要信任的东西放到区块链上。

DApp客户端

  1. 定义:相当于C/S或B/S结构中的C端或者B端。区别在于它们可能与区块链交互,也有可能与我们自己服务端交互。目前大多数的客户端用JS编写,因为可以运行在浏览器中。当然也可以用其他语言来编写。nodejs中有meteor工具来辅助开发。

DApp浏览器

  1. 用来让DApp客户端(常常使用JS与以太坊的智能合约进行交互)的使用更加容易。
  2. 主要目的:
    1. 提供到一个以太坊节点的连接(或者连接到一个本地节点或者远程节点),和一个方便的切换不同节点(甚至是不同的网络)。
    2. 提供一个帐户(或者一个钱包)来方便用户与DApp交互。
  3. 目前有哪些浏览器
    1. Mist是以太坊官方的DApp浏览器。一个漂亮的界面来与以太坊节点交互,与智能合约发、收交易。
    2. Status是一个手机上可以使用的DApp浏览器.
    3. MetaMask是一个Google浏览器扩展,把Chrome变成了一个DApp浏览器。它的核心特性是注入以太坊提供的js客户端库web3,到每一个界面,来让DApp连接到MetaMask提供的以太坊节点服务。不过这个Chrome扩展,可以允许你管理你的钱包,以及连接到不同的以太坊网络(译者注:包括本地的开发网络)。
    4. Parity是一个以太坊客户端(也是一个全节点的实现),集成到了Web浏览器,并使之成为一个DApp浏览器

GAS

  1. 定义:以太坊上每一次计算和存储所需要的费用,这个费用用gas来支付。它是用来衡量在一个具体计算中要求的费用单位。gas price就是你愿意在每个gas上花费Ether的数量,以“gwei”进行衡量。“Wei”是Ether的最小单位,1Ether=10^18Wei,1gwei=1,000,000,000 Wei。gas limit代表用户愿意花费在gas上费用的最大值。
    image
  2. 作用:
    1. 防止死循环(因为以太坊的智能合约是图灵完备的)
    2. 防止以太坊超负荷
    3. Gas限制是比特币上区块大小限制的对应物.目前的Gas上限是6.7百万gwei

账户(对应以太坊白皮书)

  1. 账户分类:
    1. 外部账户:被用户(私钥)控制的账户
    2. 合约账户:是由运行在区块链自身上的代码(合约)来控制的,即被整个区块链控制。
  2. 账户状态:
    • State consists of key value mapping addressed to account objects
    • Every account objest contains 4 pieces of data:
      • Nonce:如果账户是一个外部拥有账户,nonce代表从此账户地址发送的交易序号。如果账户是一个合约账户,nonce代表此账户创建的合约序号
      • Balance:此地址拥有Wei的数量。1Ether=10^18Wei
      • Code hash(code = empty string for private key-controlled accounts ):此账户EVM代码的hash值。对于合约账户,就是被Hash的代码并作为codeHash保存。对于外部拥有账户,codeHash域是一个空字符串的Hash值
      • Storage trie root:Merkle Patricia树的根节点Hash值。Merkle树会将此账户存储内容的Hash值进行编码,默认是空值
  3. 账户之间的关系
  • 消息由外部帐号发起,合约账户不能成为消息的发起者
    image

Coin和Token

  1. Coin,是区块链的原生货币,有自己的区块链,如BTC、LTC
  2. Token,特定的资产或者某种效力,通常以现有的一个区块链为基础。大多数的以太坊的ERC20/ERC23代币都是协议代币
  3. 两者都是Cryptocurrencies

网络,节点,区块

  1. 网络
    1. Mainnet-以太坊主网,通常是所有客户端的默认网络。
    2. Ropsten - 以太坊使用工作量证明的主测试网络。这个网络,因为低的计算量,容易遭到DDOS攻击,分片,或者其它问题。垃圾邮件攻击后被暂时放弃,最近才恢复使用。
    3. Kovan-parity客户端组成的测试网络,使用授权证明来提升对垃圾邮件攻击的抗扰度,并且持续4秒的阻塞时间。
    4. Rinkeby-geth客户端组成的测试网络,使用集团共识,尽管计算量低,但是对恶意行为者更有弹性。
  2. 节点
    1. 定义:为区块链网络中的一台电脑(简单理解的话,再详细点是指那个区块链进程)存放了整个区块链的数据。节点分成全节点(有完整的数据)和轻节点。可以通过geth来运行一个全节点(官方的节点,go语言),或者parity来运行一个轻节点。
  3. 区块
    1. 区块包含:
      1. 区块头
        • parentHash:父区块头的Hash值(这也是使得区块变成区块链的原因)
        • ommerHash:当前区块ommers列表的Hash值
        • beneficiary:接收挖此区块费用的账户地址
        • stateRoot:状态树根节点的Hash值
        • transactionsRoot:包含此区块所有交易的Merkle树的根节点Hash值
        • receiptsRoot:包含此区块所有交易收据的Merkle树的根节点Hash值
        • logsBloom:由日志信息组成的一个Bloom过滤器 (一种数据结构)
        • difficulty: 此区块的难度级别
        • number:当前区块的计数(创世纪块的区块序号为0,对于每个后续区块,区块序号都增加1)
        • gasLimit:每个区块的当前gas limit
        • gasUsed: 此区块中交易所用的总gas量
        • timestamp:此区块成立时的unix的时间戳
        • extraData:与此区块相关的附加数据
        • mixHash:一个Hash值,当与nonce组合时,证明此区块已经执行了足够的计算
        • nonce:一个Hash值,当与mixHash组合时,证明此区块已经执行了足够的计算
          image
      2. 关于包含在此区块中的交易集信息
      3. 与当前区块的ommers相关的一些列其他区块头

开发工具和开发库

  1. 发布框架
    1. Truffle框架 & Truffle教程
    2. Embark框架
  2. 去中心化的智能合约包管理资源库
    1. ETHP & 使用教程
  3. 反编译智能合约/Disassembly
    1. 可以通过prosity来反编译以太坊智能合约的字节码,可以使用evmdis来Disassembly。
  4. Whisper是一个集成进以太坊的消息系统。它允许DApp发布小量的信息来进行非实时的消息通信。使用ssh协议。一个使用Whisper协议实现一个聊天客户端的例子
  5. Open Zeppelin是一系列经过审查的,最佳的智能合约实践,你可以继承并应用于你自己的DApp中。github学习资源

应用项目

  1. 去中心自动化组织
  2. Aragon设计一个根据智能合约逻辑运作的公司,重点是创建一个可以接受投资,处理会计,支付雇员,分配股权,正如我们现在知道的完成每天的公司的业务。他们也实现了漂亮的DApp客户端来让他们的协议使用起来更为简单。
  3. IPFS(星际文件系统)是一个协议,用来分发文件。
  4. FileCoin是Protocol Lab为创建一个去中心化的基于IPFS的存储市场的努力结果,也就是向整个网络提供存储资源的激励层
  5. Swarm是一个去中心化的存储网络,集成于以太坊生态系统
  6. Augur是一个去中心化的预测市场,让大家对于某个现实世界的事件进行对赌
  7. Gnosis与Augur有类似的理念,也是一个去中心化的预测市场
  8. Golem是一个分布式的算力市场
  9. 0xProject创建了一个交换代币的协议,以及一个DApp来实现这个协议。
    10.district0x是一个更高层级的去中心化的市场和社区。
  10. uPort在解决去中心化的身份识别问题。

一些公司

  1. ConsenSys(有点像共识Consensus,但作为一个公司名称;它很聪明,巧妙的把u改成了s,但我一般念为“con-SEn-SIS”,避免读错)是一个“风险投资和产品工作室”。他们是一个(其实非常大)伞形组织,它赞助了一大堆项目和核心组件的开发。值得一提的是,它们资助了Truffle,Infura,MetaMask,Gnosis和uPort。
  2. Zeppelin Solutions在上面我们有提到过,他也审查智能合约代码,提供咨询服务。他们的博客质量相当高。
  3. Protocol Labs是一群让人印象深刻的人,致力于IPFS,FileCoin,lip2p以及IPLD等其它项目的开发。