以太坊状态转换是指交易(TX)发生时,以太坊处于正确状态(S)转向下一个正确的状态(S’)转换过程。
为了防止代码指数爆炸和无限循环,每笔交易都需要限制由执行代码引起的计算步骤。STARTGAS就是限制,GASPRICE每一步都需要支付矿主的费用。
以太坊状态转换函数为APPLY(S,TX)->S’,可定义如下:
1、检查交易的格式是否正确,签名是否有效,以及随机数是否与发送者账户的随机数匹配。如否,返回错误。
2.计算交易费用fee=STARTGAS*GASPRICE,并从签名中确定发送人的地址。从发送人账户中减去交易费用,增加发送人的随机数量。如果账户余额不足,则返回错误。
3、设定初值Gas=STARTGAS,并根据交易中的字节数减去一定量的燃料值。
4.从发送人的账户转移到接收人的账户。如果没有接收账户,新手将创建该账户的短期货币投机操作技能。如果接收账户是合同,则操作合同代码,直到代码运行结束或燃料耗尽。
5.如果发送人账户费用不足或燃料耗尽导致价格转移失败,并恢复原状态,也需要向矿主账户支付交易费。
6.成功执行基代码,将剩余燃料返还给发送人,消耗的燃料作为交易费用发送给矿主。
例如,假设合同代码如下:
需要注意的是,在现实中,合同代码使用底层以太坊虚拟机EVM代码是用我们的高级语言编写的。Serpent语言可以编译成EVM代码。假设合同存储器开始时空,一个值10以太,燃料2000,燃料价格0.01以太和两个数据字段值为[2,’CHARLIE’]状态转换函数的处理过程如下:
检查交易是否有效,格式是否正确;
2.检查交易发送者是否至少检查2万*0.001=2以太币。如有,从发送人账户中减去2个以太币;
3、初始设定Gas=假设交易长度为170字节,每字节费用为5,减去850,所以还剩1150;
4.从发送人账户中减去10个以太币,为合同账户增加10个以太币;
5.操作代码。在本合同中,操作代码非常简单:检查合同内存索引是否已使用,注意未使用,然后将其值放置为CHARLIE。假设这消耗了187单位的燃料,剩余的燃料 是1150-187=963.
6.增加发送者账户963*0.001=0.963个以太币,回到最终状态。
如果没有合同接收交易,所有交易费用都是GASPRICE*交易字节长度,交易数据与交易成本无关。此外,需要注意的是,合同发起的信息可以计算和分配燃料限额。如果子计算的燃料耗尽,当消息发出时,它只会恢复到状态。
因此,与交易一样,合同也可以通过严格限制其生产的子计算来保护其计算资源。
以太坊客户端
以太坊客户端有四种语言,以测试各种语言对以太坊的支持,让更多的人参与以太坊的开发和使用。
它们分别是
用Go实现语言客户端Geth;
用C 客户端实现Eth;
用Python实现语言客户端Pyethapp;
用Java实现客户端EthereumJ,
其中Go语言版是以太坊官方维护和推荐的客户端。
以太坊包括一个特殊的客户浏览器,允许用户运行各种分散的应用程序(DApp),发布智能合同。
这个浏览器被称为Mist,使用方便,降低了用户的使用门槛DApp大量用户可以使用智能合同。它的功能相当于浏览器在互联网或iTunes下载数字内容。Mist由与区块链相关的特殊安全层、密钥管理、分散账户管理和组件组成。
这一切使得Mist成为普通用户运营或管理区块链去中心代理应用不可缺少的工具,普通用户不需要了解技术。
从用户体验的角度来看,可以Mist中使用DApp(比如预测市场Augur)可在以太坊Mist浏览器运行。当然,这些服务也可以通过常规浏览器更传统Web 2.0实现的方法。