信息安全从业人员^_^
一个未入门de情报学胖子(邮箱:tenghm1986@163.com)
Toggle navigation
信息安全从业人员^_^
主页
About Me
归档
标签
以太坊白皮书[中文]
2018-10-24 15:53:00
1170
0
0
heming
# 0.1 参考 [1] [以太坊维基中文](https://github.com/ethereum/wiki/wiki/%5BSimplified-Chinese%5D-Ethereum-TOC) [2] [以太坊链查看](https://www.etherchain.org/) [3] [以太坊白皮书-英文](https://github.com/ethereum/wiki/wiki/White-Paper) [4] [以太坊白皮书-中文](https://github.com/ethereum/wiki/wiki/%5B%E4%B8%AD%E6%96%87%5D-%E4%BB%A5%E5%A4%AA%E5%9D%8A%E7%99%BD%E7%9A%AE%E4%B9%A6) # 0.2 术语 DAOs:decentralized autononous organisations(去中心自治组织) UTXO:unspent transaction outputs(没有用掉的比特币合集) # 1.welcome - 底层私有报文通信平台:Whisper - 去中心化的存储和内容分发服务:Swarm >这些符合逻辑的扩展(智能合约)就是去中心化自治组织(DAOs),组织的规则编码就是智能合约 ## 1.1 历史 - 1998 戴伟(Wei Dai)B-Money首次引入通过解决计算难题和去中心化共识创造货币的思想 - 2005年芬妮(Hal Finney)引入“可重复使用的工作量证明机制”概念,使用计算困难的哈希现金难题来创造密码学货币 --- **Notes** 理想化,依赖于可信任的计算作为后端 --- 共识算法(交易顺序至关重要) - 拜占庭容错(Byzantime-fault-tolerant),系统必须知道N方参与系统,容忍N/4的恶意参与者 女巫攻击是基于拜占庭容错协议需要考虑的问题 >**女巫攻击解释** p2p网络有冗余,多重备份,如果有恶意的实体模仿了多个身份,数据备份节点如果被欺骗地备份到同一个恶意节点,篡改 >**女巫攻击应对策略** - POW证明,证明你是一个节点不是伪造的 - 身份认证(第三方的身份认证/纯分布式的身份认证) ## 1.2 作为状态转换系统的比特币 从技术角度讲,比特币账本可以被认为是一个状态转换系统,该系统包括所有现存的比特币所有权状态和“状态转换函数”。 状态转换函数以当前状态和交易为输入,输出新的状态 <center> ![状态转换](https://leanote.com/api/file/getImage?fileId=5b7386cfab644160e80006e8) </center> 比特币系统的状态是所有已经被挖出的,没有花费的比特币的集合UTXO(unspent transaction outputs,UTXO) 每个输入包含一个对现有UTXO的引用和与所有者地址相对应的私钥创建的密码学签名 >APPLY(S,TX)-->S<sup>'</sup> Alice 6+4+2 -->(11.7)Bob demo ## 1.3 挖矿 <center> ![block-chain](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003deb) </center> - 如果我们有可信任的中心化服务机构,状态转换系统可以很容易实现。 - 为了确保每个人都同意交易的顺序,我们需要将状态转换系统与一个共识系统结合起来。 - 网络设计大约10分钟产生一个区块,每个区块包含一个**时间戳**、一个**随机数**、一个对**上一个区块的引用**、上一区块生成依赖发生的所有**交易列表** 检查一个区块是否有效的算法如下: - 区块引用的上一个区块是否存在且有效 - 区块的时间戳是否晚于以前的区块的时间戳,而且早于未来2小时 - 检查区块的工作量证明是否有效 - 将上一个区块的最终状态赋予S[0] - 假设TX是区块的交易列表,验证APPLY(S[i],TX[i]) - S[n]这一区块的最终状态 区块验证算法的有趣部分是"工作量证明": - 每个区块SHA256哈希处理,256比特的数值,该数值小于不断动态调整的目标函数 - 工作量证明的目的是使区块的创建变得困难,从而阻止女巫攻击 攻击者会选择没有被密码学直接保护的部分:交易顺序 >demo: 1.向卖家发送100BTC购买商品 2.等待直至商品发出 3.创建另一笔交易,将相同的100BTC发送给自己的账户 4.使比特币网络相信发送给自己账户的交易最先发出 (51%攻击) ## 1.4 默克尔树 <center> ![Merkle Tree](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003dec) </center> <center> ![block-struct](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003def) </center> - 区块存储在多层次的数据结构中 - 区块的哈希实际上是区块头的哈希,区块头包含: - 时间戳 - 随机数 - 上一个区块哈希 - 存储所有交易的默克尔树的根哈希的长度大约为200字节的一段数据 节点: - 全节点--存储和处理所有区块的全部数据节点,2018年7月数据量200多G - 轻节点--简化支付确认(SPV),下载区块头,使用区块头确认工作量证明,然后只下载与其交易相关的梅克尔树分支 ## 1.5 其他区块链应用 - 域名币,目前身份标识是像"1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy"这样的伪随机哈希,希望可以有像"heming"这样账户,先申请原则(first-to-file) - 彩色币 - 元币 观点: - 大多数的应用太小不足以保证自由区块链的安全 ## 1.6 脚本 比特币系统的脚本语言存在一些严重的限制: - 缺少图灵完备性(不支持循环) - 价值盲(value blindness)--there is no way for a script to get any external information - 缺少状态(Lack of state) - 区块链盲(Blockchain blindness),随机源,获取不到区块链上数据 # 2.以太坊 - 以太坊的目的是基于脚本/竞争币和链上元协议(on-chain meta-protocol)概念进行整合和提高,使得开发者能够创建任意的基于共识的/可扩展的/标准化的/特性完备的/易于开发的和协同的应用。 - 以太坊通过建立终极的抽象的基础层-内置有图灵完备编程语言-使得任何人都能够创建合约和去中心化应用并在其中设立他们自由定义的**所有权规则**/**交易方式**和**状态转换函数** - 图灵完备性----》缺少图灵完备性 - 价值知晓(value awareness)----》价值盲(value blindness) - 区块链知晓(blockchain awareness)----》区块链盲(blockchain blindness) - 多状态----》缺少状态(lack of state) ## 2.1 以太坊账户 each account having a 20-byte address - the nonce,a counter used to make sure each transaction can only be processed once(计数器,交易次数) - the account's current ether balance(当前余额) - the account's contract code,if present(账户的合约代码,如果有的话) - the account's storage(账户存储,默认为空) 账户分为两种: - 外部账户(私钥控制) - 合约账户(合约代码控制) ## 2.2 消息和交易 以太坊的消息在某程度上类似于比特币的交易,但是两者存在三点重要的不同: - 以太坊的消息可以由外部实体或者合约创建--消息来源 - 以太坊消息可以选择包含数据 - 以太坊消息的接受者是合约账户,可以选择进行回应 ### 2.2.1 交易 交易是指存储外部账户发出的消息的签名数据包。 - 消息的接收者 - 发送者签名 - 以太币账户余额 - 要发送的数据 - GASLimit 和 GasPrice 合约地址是基于账号随机数和交易数据的哈希计算出来 ### 2.2.2 消息 a message contains: - the sender of the message(implicit,隐藏) - the recipient of the message - the amount of ether to transfer alongside the message - an optional data field - a STARTGAS value ## 2.3 以太坊状态转换功能 <center> ![state transition function](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003df0) </center> 以太坊的状态转换函数:APPLY(S,Tx)->S<sup>'</sup> - 检查交易的格式是否正确(right number of values,the signature is valid,the nonce matches the nonce in the sender's account) - 计算交易费用fee=STARTGAS * GasPrice,subtract the fee from the sender's account balance and increment the sender's nonce - Initialize GAS=STARTGAS,and take off a certain quantity of gas per byte to pay for the bytes in the transaction. - Transfer the transaction value from the sender's account to the receiving account,如果是合约账户要执行代码,直到gas消耗完 - 如果因为发送者账户没有足够的钱或者代码执行耗尽瓦斯导致价值转移失败,恢复原来状态,但还需要支付交易费用,交易费用加至矿工账户 - 否则,将所有剩余的瓦斯归还给发送者,消耗掉的瓦斯作为交易费用发送给矿工 >**demo** 假设合约存储器开始时是空的,一个值为10以太,瓦斯为2000,瓦斯价格为0.001以太并且64字节数据,第一个三十二字节的快代表号码2和第二个代表词CHARLIE。的交易发送后,状态转换函数的处理过程如下: 1.检查交易是否有效、格式是否正确 2.检查交易发送者至少有2000*0.001=2个以太币。如果有,从发送者账户中减去2个以太币。 3.初始设定gas=2000,假设交易长为170字节,每字节的费用是5,减去850,所以还剩1150 4.从发送者账户减去10个以太币,为合约账户增加10个以太币。 5.运行代码。在这个合约中,运行代码很简单:它检查合约存储器索引为2处是否已使用,注意到它未被使用,然后将其值置为CHARLIE。假设这消耗了187单位的瓦斯,于是剩余的瓦斯为1150 - 187 = 963。 6.向发送者的账户增加963*0.001=0.963个以太币,返回最终状态 ## 2.4 代码执行 以太坊合约的代码使用低级的**基于堆栈的字节码的语言**写成,被称为**"以太坊虚拟机代码"**或者**"EVM代码"** 每个字节代表一种操作,操作可以访问三种存储数据的空间: - 堆栈 - 内存 - 合约的长期存储 --- **执行过程** 完整的计算状态可以由元组(block_state,transaction,message,code,memory,stack,gas)来定义 - block_state 包含所有账户余额和存储的全局状态 - 每轮执行时,通过调用代码的第pc(project counter)个字节,当前指令被找到,每个指令都有定义自己如何影响元组 demo: ADD 将两个元素出栈并将它们的和入栈,将gas减一,并将pc加一 --- ## 2.5 区块链和挖矿 与比特币的区别,不仅包含交易记录和最近状态,还包含区块序号和难度值 <center> ![ethereum-block](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003ded) </center> <center> ![block-detail](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003df1) </center> > 解读: - Receipts Root Hash 和 Transactions Root Hash 一致,查询后每个block的此两值一致不变 - State Root Hash一直改变 以太坊的区块确认算法如下: - 检查区块引用的上一个区块是否存在和有效 - 检查区块的时间戳是否比引用的上一个区块大,而且小于15分钟 - 检查区块序号、难度值、交易根、叔根和瓦斯限额是否有效 - 检查区块的工作量证明是否有效 - 将S[0]赋值为上一个区块的STATE_ROOT - 将TX赋值为区块的交易列表,一共有n笔交易。对于属于0......n-1的i,进行状态转换S[i+1]=Apply(S[i],TX[i]),如果任何一个转换发生错误,或者程序执行到此处所花费的瓦斯(gas)超过GASLIMIT,返回错误 - 用S[n]给S_FINAL赋值,向矿工支付区块链奖励 - 检查S_FINAL是否与STATE_ROOT相同 <center> ![yellow-paper](https://leanote.com/api/file/getImage?fileId=5bd024dbab64417e26003dee) </center> 存储每个区块的所有状态,但以太坊的确认效率可以与比特币相提并论,主要是采用了"帕特里夏树" # 3.应用 一般来讲,以太坊之上有三种应用: - 金融应用 - 半金融应用 - 非金融应用(在线投票,去中心化治理) ## 3.1 令牌系统 链上令牌系统有很多应用,从代表如美元或黄金等资产的子货币到公司股票,单独的令牌代表智能资产,安全的不可伪造的优惠券,甚至与传统价值完全没有联系的用来进行积分奖励的令牌系统。在以太坊中实施令牌系统容易得让人吃惊。关键的一点是理解,所有的货币或者令牌系统,从根本上来说是一个带有如下操作的数据库:从A中减去X单位并把X单位加到B上,前提条件是(1)A在交易之前有至少X单位以及(2)交易被A批准。实施一个令牌系统就是把这样一个逻辑实施到一个合约中去。 ``` def send(to, value): if self.storage[from] >= value: self.storage[from] = self.storage[from] value self.storage[to] = self.storage[to] + value ``` ## 3.2 金融衍生品 金融衍生品是“智能合约”的最普遍的应用,也是最易于用代码实现的之一。实现金融合约的主要挑战是它们中的大部分需要参照一个外部的价格发布器;例如,一个需求非常大的应用是一个用来对冲以太币(或其它密码学货币)相对美元价格波动的智能合约,但该合约需要知道以太币相对美元的价格。最简单地方法是通过由某特定机构(例如纳斯达克)维护的“数据提供“合约进行,该合约的设计使得该机构能够根据需要更新合约,并提供一个接口使得其它合约能够通过发送一个消息给该合约以获取包含价格信息的回复。 ## 3.3 身份和信誉系统 最早的替代币,域名币,尝试使用一个类比特币块链来提供一个名称注册系统,在那里用户可以将他们的名称和其它数据一起在一个公共数据库注册。最常用的应用案例把象“bitcoin.org“(或者再域名币中,”bitcoin.bit“)一样的域名与一个IP地址对应的域名系统。其它的应用案例包括电子邮件验证系统和潜在的更先进的信誉系统。这里是以太坊中提供与域名币类似的的名称注册系统的基础合约 ## 3.4 去中心化文件存储 首先:某人将需要上传的数据分成快,对每一块数据加密以保护隐私,并且以此构建一个默克尔树 然后:创建一个含以下规则的合约,每N个块,合约将从默克尔树中抽取一个随机索引(使用能够被合约代码访问的上一个块的哈希来提供随机性) 再然后:第一个实体X以太以支撑一个带有类似简化验证支付(SPV)的在树中特定索引处的块的所有权证明 当一个用户想重新下载他的文件,他可以使用微支付通道协议(例如每32k字节支付1萨博)恢复文件;从费用上讲最高效的方法是支付者不到最后不发布交易,而是用一个略微更合算的带有同样随机数的交易在每32k字节之后来代替原交易。 ## 3.5 去中心化自治组织 - DAO是指拥有一定数量的成员或股东的虚拟实体,依靠67%多数来决定花钱以及修改代码 ## 3.6 进一步应用 - 储蓄钱包(夫妻共管账户) - 作物保险 - 一个去中心化的数据发布器(谢林点) - 云计算 - 点对点赌博 - 预测市场 # 4. 杂项和关注 ## 4.1 改进版幽灵协议的实施 幽灵协议("Greedy Heaviest Observed Subtree protocol") - 叔区块(祖先块作废的后代区块,下探到第五层的) ## 4.2 费用 ## 4.3 计算和图灵完备
上一篇:
区块链学习资料整理
下一篇:
以太坊黄皮书[中文]
0
赞
1170 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
文档导航