《以太坊白皮书》-下一代智能合约和去中心化应用平台
首先,开篇说了2009年中本村的全球社会化大实验-比特币的一些问题,比如比特币没有内在价值,但是他是区块链领域的开山之作。接着说了以太坊要做什么?就是它计划提供一种图灵完备的编程语言用于区块链中,就是我们现在知道的智能合约。
第一章 比特币基本概念
2009年,中本聪首次实施了分布式货币,通过公钥密码体制来管理所有权与公式算法追踪谁拥有货币的结合,即我们知道的工作量证明。工作量证明解决了两个问题,第一就是他解决了网络中的节点共同商定对比特币账本的更新问题,第二就是他允许了自由进入共识的流程机制,解决了谁来影响共识的政治问题。但是有个问题就是节点的权重和他的算力成正比。
比特币的状态转换系统
实际上比特币的账本可以被认为是一个状态转换系统,其中存在一个所有现有比特币的所有权状态组成的“状态”和一个状态转换功能。“状态”就是已产生和未用完的货币的集合(未使用的交易输出或者UTXO),每个UTXO有一个面额和一个拥有者,本质上就是一个密码公钥。交易包含一个或者多个输入,每个输入要包含对现有UTXO的引用和由所有者地址相关的私钥生成的加密签名,以及一个或者多个输出,每个输出要添加到新的UTXO中去。
Mining挖矿
比特币的分布式共识需要网络中的节点不断尝试生成“块”的交易包,网络每10分钟产生一个块,每个块都有一个时间戳,和一个随机数,一个前一个块的引用和一个自上次产生以来的所有交易列表。
这里挖矿的概念就不详细介绍,可以去查看比特币白皮书。或者参考解读中本聪的比特币白皮书
然后说了恶意攻击的情况,因为比特币是密码学安全的,所以攻击将会瞄准系统中不受密码学保护的部分:交易顺序。其实就是双花模型。
1:发送比特币给一个商户,购买一些产品(比如某NFT或者数字藏品),
2:等待商品发货
3:创建另外一个交易,将刚才的比特币发送给自己另外一个账户
4:试图让网络相信,那比发送给自己的交易是第一笔交易。
正常的工作顺序应该是,比如1交易发生,几分钟后矿工把交易包含在一个区块中,比如27000区块,在1个小时后,大约新产生了5个区块都指向这个交易,然后商家就会把产品交付出去。但是如果攻击者发起攻击,那么他得先产生另外一个版本的“27000”区块,然后把父区块指向26999,然后他还得产生新的27001-27005指向自己的27000区块,因为比特币的规则是,最新的区块默认是最长的一个,所以攻击者想要自己比其他的区块长,那么他得比其他的网络有更多的算力才行(51%攻击)。
默克尔树
因为比特币的存储是在多级数据结构中,区块的“散列”实际只是块头的散列,包含时间戳、随机数、先前区块散列和Merkle数的数据结构的根散列。Merkle数是一种二叉树,由一组根节点组成,每个节点是由两个子节点的散列,最后一个是单一的根节点,代表树的顶部。如果恶意用户想要改变虚假交易替换Merkle树的底部,都会导致上方节点改变,最后改变整个根,所以可以很轻易的判断出他是否为有效交易。
目前来说,由于Merkle树协议,之前的节点是存储全部的账本的,到2014年的时候,已经占用了15GB的磁盘空间,所以出现了一种“轻节点”,既他只存储了头部区块和与他们相关交易的分支。
其他区块链的应用
Namecoin 是2010年创建,叫分布式名称注册数据库,比如人们以“张三”贮存一个账户,那么其他人再用张三这个名字注册既不被认可,因为他采取的方法是first-to-file模式。
Colord coin,它是一种协议,允许人们在比特币链上创建自己的数字货币,人们创建的数字货币用一种不同的颜色来进行区分(实际是命名一种颜色的UTXO).
上面两个案例说明了在比特币网络上创建一种共识协议的方式,第一种的弊端就是要搭建一套独立的网络,这比较困难,第二种就是应用太小不能保证自己的安全,因为V神认为分布式共识技术的应用程序将遵循幂律分布。
脚本
虽然可以在比特币上实现简单的脚本,但是还是有如下的缺陷:
1. 缺乏图灵完备,它不支持所有的计算,缺少主要的是类循环。
2. 价值盲0UTXO无法对可撤销的金额进行精细化控制。
3. 缺乏状态-UTXO只有用完和没用完两种状态。
4. 区块链盲,UTXO对区块链数据(随机数、时间戳、区块哈希)视而不见。
综上,以太坊就是要建立一个新的区块链,可以使用脚本构建元协议,并且该协议是无限制的,而脚本也是很容易和标准化的。
以太坊
以太坊通过构建本质上最终的抽象基础层来实现的区块链网络:一种内置图灵完备的编程语言,允许任何人编写智能合约和分布式计算程序,这些程序可以为所有权,交易格式和状态转换函数编制自己的规则。
以太坊账户
在以太坊中,状态有“账户”的对象组成,每个账户有20个字节的地址,状态转换是账户之间的价值和信息的直接转移。包含4个字段:
1随机数,用于确定每笔交易只能被处理一次的计算机
2. 账户的余额
3. 账户的合约代码
4. 账户的存储
“以太”是以太坊内部的主要加密燃料,用于支付交易费用。账户分为两种类型,外部所有的账户,由私钥控制,合同账户由合同代码控制。外部所有的账户没有代码,人们从外部所有账户发送消息,以创建和签署交易; 在合同账户中,合约账户每次收到消息后,代码激活,将允许对内部存储进行读写和发送其他消息或者依次创建合约。
消息和交易
“交易”术语在以太坊中是指被外部所有账户发送的存有消息的经过签署的数据包。交易包含:
1.消息的接受人
2. 能证明发送者身份的签名
3. 一定数量的从发送者转移至接受者的以太币
4. 一个可选的数据字段
5. 一个可选的数据字段
6. TARTGAS值,代表交易被执行时可以运行的最大计算步骤数
7. GASPRICE值,代表发送者为每个计算步骤支付的费用
对于6和7主要是为了防止代码中的意外和恶意无限循环,因为每一步骤都需要花费gas费。
消息
合约具有向其他合约发送“消息”的能力。消息是从没有被序列化的,只存在于以太坊执行环境的虚拟对象。消息包含:
1. 消息的发送者
2. 消息的接受者
3. 与消息一起被转移的以太币数量
4. 可选的数据字段
5. STARTGAS值
消息其实就是一个交易,它是由合同产生的而不是外部参与者生产的,一条消息会导致接收人账户运行其代码。
以太坊的状态转换函数
1. 检查交易是否被构建完好(例如,有正确的值),签名是否正确,随机数是否与发送者账户的随机数匹配。如果不是,返回错误。
2. 通过 STARTGAS * GASPRICE计算出交易费用,确定发生地址来自于签名,从发送者账户减去费用,同时增加发送者的随机数。如果没有足够的余额,返回错误。
3. 初始化 GAS = STARTGAS,在交易中支付确定每字节数量的gas。
4. 从发送者账户转移交易数额至接受者的账户。如果接受者的账户不存在,创建一个。如果接受者账户是一个合约,运行合约代码要么完成,要么用光了所有的gas。
5. 如果是因为发送者没有足够的钱而导致转移失败,或者是代码运行用光了gas,除了支付的费用外,恢复所有状态的更改,并将费用支付给矿工的账户。
6. 相反的情况,将剩余的费用找零给发送者,支付消耗的费用给矿工。
举个例子,这段很重要,看懂了你就理解了以太坊的交易逻辑。
假设,合约的存储从空开始,交易是发送:10个以太币,2000gas,0.001 gasprice 和 64字节,其中字节0-31代表数字2,字节32-63代表字符串CHARLIE。
1. 检查交易是否有效并组织完好
2. 检查交易发送者至少拥有2000 * 0.001 = 2 个以太币,并从其账户上扣减2个以太币
3. 始化 gas = 2000,假定交易是170字节,每字节5gas,减去850gas,剩下 1150 gas
4. 从发送者账户减去10个以太币,将其增加到合约账户
5. 检查合约账户的存储索引 2 是否被使用,提示没有,则将存储索引2的数据设置为 CHARLIE 。假设这花费了187gas,余下的就是 1150 - 187 = 963 gas
6. 返还 963 * 0.0001 = 0.963 以太币到发送者账户,同时返回结果状态。
执行代码
以太坊合约中的代码采用低级的基于堆栈的字节码编写的,称为“EVM代码”,它是由一些列字节组成,每个字节表示一个操作,然后程序计数器+1.知道代码循环结束或者错误或者STOP。而这些操作可以访问三种类型的数据存储:
1. 堆栈,数据压入淡出的后进先出容器
2. 内存,一个无限拓展的字节数组
3. 合约的长期存储,一个键值存储,与堆栈和内存在计算结束后重置不同,他会长期保存。
EVM执行时,它的完整计算状态可以由元组(block_state,transaction,message,code,memory,stack,pc,gas)定义,其中block_state表示账户的全局状态并包含余额和存储。在每轮执行前,都可以通过指令来找到全部元组的定义,然后运行时,改变元组定义,将gas减少1,PC th值加一。
区块链和挖矿
以太坊的区块链和比特币有相似的地方,但是也有区别,以太坊的区块不仅包含交易列表和最新状态副本,还包含区块号和难度。
他的数据结构不是采用了Merkle树,而是用了Patricia树,相比较来说,稍微高效了一点,比比特币节省了5-20倍的空间。
应用
总的来说有三种应用,现在我们知道以太坊上目前有成千上万的应用了。
第一类是金融程序,包括电子货币、金融衍生品、套期保值合约、储蓄钱包、雇佣合同等等。
第二类半金融应用
第三类在线投标、分布式治理等应用。
代币系统:
这里就不多说了,懂得都懂,但是需要补充一下,以太币的优势,就是他可以以货币支付交易费,既所有的应用都可以直接使用以太币来进行交易,这就让以太币很有价值,意味着上面跑的应用越多,以太币的价值就越大。
举例应用
1. 金融衍生品和价值稳定的货币,这个太多了,一搜一大把。
2. 身份和信誉系统,比如前段时间火爆的DNS,域名系统。
3. 去中心化文件存储,Dropbox。
4. 去中心化自治组织,people等
5. 存储钱包,metamask。
6. 作物保险
7. 去中心化数据反馈,谢林币
8. 智能多重签名托管
9. 云计算
10. 点对点赌博
11. 预测市场
12. 链上去中心化市场,uni等。
总结:
以太坊的最初设想是加密货币的升级版本,通过高度的编程语言提供一些高级的功能,并且它是图灵完备的,可以支持任何类型的应用和合约。相信以后以太坊会非常合适作为大量金融和非金融协议的基础层。
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除