5合约与交易.md
介绍
Ethereum是一个平台,旨在让人们轻松地使用blockchain技术编写分散式应用程序(Đapps)。分散应用程序是一种为其用户提供特定目的的应用程序,它具有重要的特性就是本身不依赖于现有的任何一方。Đapp不是作为销售的前端或者为特定方提供服务,而是一个交互应用的不同人员和组织走到一起的工具,且无需任何集中的中介。
通常在集中提供商的领域,例如过滤,身份管理,托管和争议解决,必要的“中介”功能由网络直接处理,或者让任何人参与进来,使用类似内部令牌系统和声誉系统的工具,以确保用户获得高质量的服务。Đapps的早期例子包括用于文件共享的BitTorrent和货币的BitCoin。Ethereum实现了 BitTorrent和Bitcoin所使用的基本开发内容,并将其推广到一起,以便开发人员可以将这些技术用于任何目的。
可以将Ethereum blockchain描述为具有内置编程语言的blockchain,或作为基于共识的全局执行的虚拟机。实际处理内部状态和计算的协议部分被称为Ethereum虚拟机(EVM)。从实际的角度来看,EVM可以被认为是一个大型的分散式计算机,其中包含数百万个被称为“帐户”的对象,它们具有维护内部数据库,执行代码和交互的能力。
帐户有两种类型:
- 外部帐户(EOAs):由私钥控制的帐户,如果您拥有与EOA关联的私钥,则可以发送ether和消息。
- 合同:具有自己的代码并由代码控制的帐户。 默认情况下,Ethereum执行环境是无生命的; 没有任何事情发生,每个帐户的状态保持不变。然而,任何用户都可以通过从外部拥有的帐户发送一个交易来触发一个动作,从而使Ethereum运转起来。如果交易的目的地是另一个EOA,那么交易可能会转移一些ether,但是其他方式的话什么都不做。然而,如果目的地是合同,那么合同又会激活并自动运行其代码。
代码能够读/写自己的内部存储(将32字节的密钥映射到32字节的值的数据库),读取接收到的消息的存储,并发送消息到其他合同,依次触发它们执行。一旦执行停止,由合同停止所发送的消息触发的所有子执行停止(这一切都以确定性和同步顺序发生,即子呼叫在父调用进一步完成之前完成),执行环境再次停止,直到被下一次交易唤醒。
合同通常有四个目的:
- 维护一个代表对其他合同或外部世界有用的数据存储; 一个例子是模拟货币的合同,另一个是在特定组织中记录会员资格的合同。
- 作为一种外部拥有的帐户,具有更复杂的访问策略; 这被称为“转发合同”,通常仅在满足某些条件时才简单地将传入消息重新发送到某个所需目的地; 例如,转发合同的时候,在重发之前等待,直到给定的三个私钥中的两个前已经确认了特定的消息(即,multisig)。更复杂的转发合同根据发送的消息的性质有不同的条件; 此功能的最简单的用例是通过一些更复杂的访问过程来覆盖的撤销限制。
- 管理多个用户之间持续的合同或关系。这方面的例子包括一项财务合同,一些特定的介质的托管或某种保险。一方也可以有开放的合同,让任何其他方随时参与; 还有一个合同例子就是,自动向提交有效解决方案的人提供一些奖励,或证明它提供了一些计算资源。
- 为其他合同提供职能; 作为软件库。
合同通过称为“calling”或“sending messages”的活动彼此交互。“message”是一个对象,它包含一定数量ether(Ethereum中使用的特殊内部货币,主要用于支付交易费用),一个任意大小的数据字节数组,发件人和收件人的地址。当合同收到一条消息时,可以选择返回一些数据,然后该消息的原始发件人可以立即使用。这样,发送消息就像调用函数一样。
因为合同可以发挥不同的作用,我们期望合同将相互交流。例如,考虑一个情况,Alice和Bob用100个GavCoin作为赌注,赌约是旧金山的温度在明年的任何时候都不会超过35ºC。但是,爱丽丝非常有安全意识,因为她的主要帐户使用的转发合同只能通过三个私钥中的两个的密钥发送消息。鲍勃对于量子加密技术是很偏执的,所以他使用一个转发合同,此合同只传递传统ECDSA和Lamport signature一起签名的消息(但是由于他是古板的人,他更喜欢使用基于SHA256的Lamport signature版本,Ethereum不直接支持)。
赌约合同本身需要从一些合同中获取关于旧金山天气的数据,并且在实际将GavCoin发送给Alice或Bob时候同GavCoin合约交流(或者更确切地说是Alice或Bob的转发合同)。因此,我们展示帐户之间的关系如下图:
当鲍勃想完成赌注时,会发生以下步骤:
- 发送一个交易,触发从Bob的EOA到Bob的转发合同的消息。
- Bob的转发合同将消息的哈希和Lamport签名发送到作为Lamport签名验证库的合同。
- Lamport签名验证库看到Bob想要一个基于SHA256的Lamport sig,所以根据需要多次调用SHA256库来验证签名。
- 一旦Lamport签名验证库返回1,表示签名已经被验证,它会向表示下注的合同发送一条消息。
- 下注的合同检查提供旧金山温度的合同,以查看温度是多少。
- 下注合同看到,对消息的响应表明,温度高于35ºC,因此它向GavCoin合约发送消息,将GavCoin从其账户移动到Bob的转发合同。
请注意,GavCoin全部被“存储”作为GavCoin合同数据库中的条目; 在步骤6的上下文中,“account”这个词简单地意味着在GavCoin合约存储中有一个数据输入,其中有一个关键的赌注合同的地址和一个价值的余额。收到此消息后,GavCoin合约将此值减少一定数量,并增加与Bob转发合同地址相对应的条目中的值。我们可以在下图中看到这些步骤: