以太坊的状态转换与“客户端”有哪些?
以太坊的状态转换是指在一个交易(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.001以太并且两个数据字段值为[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个以太币,返回最终状态。
如果没有合约接收交易,那么所有的交易费用就算于GASPRICE*交易的字节长度,交易的数据就与交易费用无关了。另外需要注意的是,合约发起的消息可以对它们产生的计算分配燃料限额,如果子计算的燃料用完了,它只恢复到消息发出时的状态。
因此,就像交易一样,合约也可以通过对它生产的子计算设置严格的限制,保护它们的计算资源。
以太坊客户端
为了测试各种语言对以太坊的支持,同时使更多的人能够参与以太坊的开发及使用,目前有4种语言编写的以太坊的客户端。
【它们分别是】
用Go语言实现的客户端Geth;
用C++实现的客户端Eth;
用Python语言实现的客户端Pyethapp;
用Java实现的客户端EthereumJ,
其中Go语言版是以太坊官方一直维护并推荐使用的客户端。
以太坊包括一个专用的客户端浏览器,使得用户可以运行各种各样的去中心化应用(DApp),发布智能合约。
这一浏览器被称为Mist,它易于使用,降低了用户使用门槛,从而使得DApp和智能合约能够被大量用户使用。它的作用等同于浏览器之于互联网或者iTunes之于数字化内容下载。Mist由特殊的安全层、密钥管理、去中心化账户管理和与区块链相关的组件几部分组成。
这一切使得Mist成为普通用户运行或者管理区块链去中心代应用不可或缺的工具,普通用户不需要理解技术方面的东西。
从用户体验角度而言,可以在Mist中使用DApp(例如预测市场Augur)就可以在以太坊Mist浏览器运行。当然,这些服务也可以通过一个常规浏览器以更加传统的Web 2.0的方式实现。