区块链核心理论
账本(Ledger)
- 账本记录如:
- A pays B ¥40
- C pays A ¥60
- ……
- 记录可伪造,所以需要加签名
- 非对称加密:公钥(pk)和私钥(sk)
- 用户帐号:Acc(pk)=Account
- 签名:Sign(Message,sk)=Signature,将签名放到账本记录上
- 签名验证:Verify(Message,Signature,pk) = T/F,公钥解密签名,得到的Message HASH值并与账本记录Message做HASH比较。
- 签名使用AES-256
- 记录可复制
- 给每条记录添加一个唯一编号
- 不足扣则不记录
- 最终账本记录如下:
- A pays B ¥40 (A’s Signature)
- C pays A ¥60 (C’s Signature)
去中心化
- P2P 网络
- 工作量证明机制(PoW,Proof of Work)
- 算法:SHA256(Message,RandomValue)=HashValue,改变Message的一小部份,则HashValue完全不一样,它具有散列性和不可预测性,且无法逆向。HashValue长度256位。
- 工作量:当RandomValue不同时,HashValue完全不一样,而区块链协议要求算出的区块的HashValue前30位为0(即尝试10E次),且随着时间,这个值会变大,则更加难易计算。
- P2P网络中的所有节点信任这个算法,这算法即共识算法。那么这个按此算法产生的区块整个网络都认可。
- 区块创建者会得到一笔奖励,起初是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
- 区块产生时间:
- BTC:10min
- ETH:15sec
- XRP:3.5sec
- LTC:2.5min
- 账本一旦写入不能被修改。
- 所有区块使用默克尔树连接在一起,新的区块在后面,则导致整个区块不能修改。
- 当有两个或者多个节点创建出区块时,都添加到上一区块上,导致区块分叉。分叉后以区块链长的分支为准,同时取消掉其他分支。
- 伪造账单,会导致区块链分叉。但如果算力小于整个网络的50%,那么最终会被正确的区块链取消。
以太坊核心概念
- 以太坊开发入门
- V神演讲-25分钟理解以太坊
- 对应中文翻译-上
- 对应中文翻译-下
- 以太坊HASH算法:KECCAK-256
- 分叉协议:GHOST协议(GHOST protocol)=(Greedy Heaviest Observed Subtree)
智能合约
- 一个合约是一个帐号,它成为消息的目标,那么合约就会被调用。调用者可以是外部帐号,也可以是其他合约帐号。
- 合约代码运行在EVM上,并分布到整个网络每个节点
- 合约代码一旦发布,不可变,且永久存在
- 合约代码过程中状态的存储,是不可变的
- 智能合约开发语言:
- 智能合约最佳实践
DApp
- 定义:相当于C/S或B/S结构中的S端,一部分放在以太坊上,由运行于以太坊网络上一个或多个智能合约的组成;另一部分可以是我们现在意义上的服务端。
- DApp并不把所有的状态都存储在区块链上,也不把所有的计算都放在区块链上,不然话费的Gas量太大。只把大家需要信任的东西放到区块链上。
DApp客户端
- 定义:相当于C/S或B/S结构中的C端或者B端。区别在于它们可能与区块链交互,也有可能与我们自己服务端交互。目前大多数的客户端用JS编写,因为可以运行在浏览器中。当然也可以用其他语言来编写。nodejs中有meteor工具来辅助开发。
DApp浏览器
- 用来让DApp客户端(常常使用JS与以太坊的智能合约进行交互)的使用更加容易。
- 主要目的:
- 提供到一个以太坊节点的连接(或者连接到一个本地节点或者远程节点),和一个方便的切换不同节点(甚至是不同的网络)。
- 提供一个帐户(或者一个钱包)来方便用户与DApp交互。
- 目前有哪些浏览器
GAS
- 定义:以太坊上每一次计算和存储所需要的费用,这个费用用gas来支付。它是用来衡量在一个具体计算中要求的费用单位。gas price就是你愿意在每个gas上花费Ether的数量,以“gwei”进行衡量。“Wei”是Ether的最小单位,1Ether=10^18Wei,1gwei=1,000,000,000 Wei。gas limit代表用户愿意花费在gas上费用的最大值。
- 作用:
- 防止死循环(因为以太坊的智能合约是图灵完备的)
- 防止以太坊超负荷
- Gas限制是比特币上区块大小限制的对应物.目前的Gas上限是6.7百万gwei
账户(对应以太坊白皮书)
- 账户分类:
- 外部账户:被用户(私钥)控制的账户
- 合约账户:是由运行在区块链自身上的代码(合约)来控制的,即被整个区块链控制。
- 账户状态:
- 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值进行编码,默认是空值
- 账户之间的关系
- 消息由外部帐号发起,合约账户不能成为消息的发起者
Coin和Token
- Coin,是区块链的原生货币,有自己的区块链,如BTC、LTC
- Token,特定的资产或者某种效力,通常以现有的一个区块链为基础。大多数的以太坊的ERC20/ERC23代币都是协议代币
- 两者都是Cryptocurrencies
网络,节点,区块
- 网络
- Mainnet-以太坊主网,通常是所有客户端的默认网络。
- Ropsten - 以太坊使用工作量证明的主测试网络。这个网络,因为低的计算量,容易遭到DDOS攻击,分片,或者其它问题。垃圾邮件攻击后被暂时放弃,最近才恢复使用。
- Kovan-parity客户端组成的测试网络,使用授权证明来提升对垃圾邮件攻击的抗扰度,并且持续4秒的阻塞时间。
- Rinkeby-geth客户端组成的测试网络,使用集团共识,尽管计算量低,但是对恶意行为者更有弹性。
- 节点
- 定义:为区块链网络中的一台电脑(简单理解的话,再详细点是指那个区块链进程)存放了整个区块链的数据。节点分成全节点(有完整的数据)和轻节点。可以通过geth来运行一个全节点(官方的节点,go语言),或者parity来运行一个轻节点。
- 区块
- 区块包含:
- 区块头
- 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组合时,证明此区块已经执行了足够的计算
- 关于包含在此区块中的交易集信息
- 与当前区块的ommers相关的一些列其他区块头
- 区块头
- 区块包含:
开发工具和开发库
- 发布框架
- 去中心化的智能合约包管理资源库
- 反编译智能合约/Disassembly
- Whisper是一个集成进以太坊的消息系统。它允许DApp发布小量的信息来进行非实时的消息通信。使用ssh协议。一个使用Whisper协议实现一个聊天客户端的例子
- Open Zeppelin是一系列经过审查的,最佳的智能合约实践,你可以继承并应用于你自己的DApp中。github学习资源
应用项目
- 去中心自动化组织
- Aragon设计一个根据智能合约逻辑运作的公司,重点是创建一个可以接受投资,处理会计,支付雇员,分配股权,正如我们现在知道的完成每天的公司的业务。他们也实现了漂亮的DApp客户端来让他们的协议使用起来更为简单。
- IPFS(星际文件系统)是一个协议,用来分发文件。
- FileCoin是Protocol Lab为创建一个去中心化的基于IPFS的存储市场的努力结果,也就是向整个网络提供存储资源的激励层
- Swarm是一个去中心化的存储网络,集成于以太坊生态系统
- Augur是一个去中心化的预测市场,让大家对于某个现实世界的事件进行对赌
- Gnosis与Augur有类似的理念,也是一个去中心化的预测市场
- Golem是一个分布式的算力市场
- 0xProject创建了一个交换代币的协议,以及一个DApp来实现这个协议。
10.district0x是一个更高层级的去中心化的市场和社区。 - uPort在解决去中心化的身份识别问题。
一些公司
- ConsenSys(有点像共识Consensus,但作为一个公司名称;它很聪明,巧妙的把u改成了s,但我一般念为“con-SEn-SIS”,避免读错)是一个“风险投资和产品工作室”。他们是一个(其实非常大)伞形组织,它赞助了一大堆项目和核心组件的开发。值得一提的是,它们资助了Truffle,Infura,MetaMask,Gnosis和uPort。
- Zeppelin Solutions在上面我们有提到过,他也审查智能合约代码,提供咨询服务。他们的博客质量相当高。
- Protocol Labs是一群让人印象深刻的人,致力于IPFS,FileCoin,lip2p以及IPLD等其它项目的开发。