EOS的交易结构

作者: 荆凯_EOS42 | 来源:发表于2017-11-19 11:44 被阅读1031次

    本文由币乎(www.bihu.com)社区支持计划赞助。

    本文结合EOS的白皮书(https://github.com/BlockchainTranslator/EOS/blob/master/TechDoc/EOS.IO%20Technical%20White%20Paper.md)和EOS的参考文档(https://github.com/EOSIO/eos)及代码,对于EOS之中交易如何完成的,做一下总结和探讨。

    主要包括:交易的多种形式、所包含的信息、如何被创建、如何被验证以及如何成为交易永久记录的一部分。至于账户和智能合约,将会在另外的篇章之中进行总结和解释。

    交易的细节

    在EOS上进行一笔转账,交易的代码会如同下面所示:

    $ ./eosc transfer inita tester 1000
    {
      "transaction_id": "eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703",
      "processed": {
        "refBlockNum": 2206,
        "refBlockPrefix": 221394282,
        "expiration": "2017-09-05T08:03:58",
        "scope": [
          "inita",
          "tester"
        ],
        "signatures": [
          "1f22e64240e1e479eee6ccbbd79a29f1a6eb6020384b4cca1a958e7c708d3e562009ae6e60afac96f9a3b89d729a50cd5a7b5a7a647540ba1678831bf970e83312"
        ],
        "messages": [{
            "code": "eos",
            "type": "transfer",
            "authorization": [{
                "account": "inita",
                "permission": "active"
              }
            ],
            "data": {
              "from": "inita",
              "to": "tester",
              "amount": 1000,
              "memo": ""
            },
            "hex_data": "000000008040934b00000000c84267a1e80300000000000000"
          }
        ],
        "output": [{
            "notify": [{
                "name": "tester",
                "output": {
                  "notify": [],
                  "sync_transactions": [],
                  "async_transactions": []
                }
              },{
                "name": "inita",
                "output": {
                  "notify": [],
                  "sync_transactions": [],
                  "async_transactions": []
                }
              }
            ],
            "sync_transactions": [],
            "async_transactions": []
          }
        ]
      }
    }
    

    命令:

    • eosc是调用api与区块链交互的客户端;
    • transfer inita tester 1000
      这里涉及到两个账户,inita和tester,其中inita是表示初始账号的一个测试账号,里面已经分配了EOS代币。

    交易的结构:

    transaction_id:当前这笔交易的hash值
    processed:其中包括的信息比较丰富,重点是如下的几个。

    "refBlockNum": 2206,
    "refBlockPrefix": 221394282

    这里是前一个区块的信息,refBlockPrefix,是取了最近的一个区块的hash值的一部分。
    根据白皮书之中的介绍,

    EOS.IO软件要求每个交易都包括最近的区块头的哈希。 这个哈希有两个目的:

    1.防止分叉区块链上出现大量交易记录;
    2.使得系统能感知到用户是否在分叉出来的区块链上

    随着时间的推移,所有用户最终直接确认块链,这使得难以伪造假冒链,因为假冒将无法从合法链路迁移交易。

    message:
    包括了代币所属的智能合约名称(eos), 类别: transfer, 所需要的权限: inita的active权限,以及交易数据结构(data).

    
     "messages": [{
            "code": "eos",
            "type": "transfer",
            "authorization": [{
                "account": "inita",
                "permission": "active"
              }
            ],
            "data": {
              "from": "inita",
              "to": "tester",
              "amount": 1000,
              "memo": ""
            },
            "hex_data": "000000008040934b00000000c84267a1e80300000000000000"
          }
        ]
    

    最后,output是表示输出的信息,其中提到了notify的操作,应该是用于通知相关账户这笔转账的信息。

    交易的信息

    在EOS上面,交易等是通过信息的方式来表示的,上面所提到的代码,定义了eos的转账方式,实际上是借助已经内含的eos合约来发起的。而对于其他的应用或者说智能合约,也是类似的处理方式,只是,其中信息的操作,是由对应的智能合约来定义的。

    消息和自动的消息处理程序的组合正是EOS.IO定义智能合约的方式。

    我们以一个示例合约为例,看下用EOS是如何发起一笔转账交易的。
    前提假设是,已经创建好了账号,并且在区块链上已经部署了一个名为currency的智能合约(即应用程序),那么,一笔调用currency的转账交易命令会如下所示:

    ./eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scope currency,inita --permission currency@active
    

    解释一下,eosc是调用api与区块链交互的客户端, 前面说到过了;
    push message,是指向区块链发送信息,类似于在比特币之中发起交易;
    currency 是所调用的合约的名称。EOS在部署一个新的智能合约的时候,会对于区块链上是否有重名的合约进行检查,避免冲突。
    transfer 是指所发起的操作,这里是转账操作。
    后面的json参数,很简单明了了,就是从"currency"这个账户,向"inita"这个账户转账,数额为50 EOS.
    接下来的--scope ,给了智能合约currency权限,可以对currency, inita这两个账户有读写的权限。
    而最后,--permission,则是标明了这一条交易信息的权限,是需要由currency这个账户的active权限所授权的,这里, currency账户就是智能合约的账户,因此,这条交易信息,就是从currency账户自身向inita这个账户转账。

    更通用的表述为:

    ./eosc push message currency transfer '{"from":"${usera}","to":"${userb}","amount":50}' --scope ${usera},${userb} --permission ${usera}@active
    

    这里的currency只是EOS上的一个示例智能合约,EOS.IO的软件,提供了开发智能合约非常便捷的工具和组件,这里的transfer,以及transfer后面所附带的json格式信息之中的参数,都是在currency这个智能合约之中定义的。想要了解更多这个合约怎么定义的,可以参考:(https://github.com/EOSIO/eos/tree/master/contracts/currency)

    可以注意到在EOS的设计之中,是围绕信息以及信息处理器(Message Handler)而展开的,相比而言,在比特币之中,主要是围绕状态(State)来设计的。Ivan Grigg有一篇文章提到了这其中的最主要区别: The Message is The Medium(信息即媒介), 可以参看。(https://github.com/BlockchainTranslator/EOS/blob/master/TechDoc/the-message-is-the-medium.md

    可以带有强制延迟的信息(Messages with Mandatory Delay)

    EOS还提供了一种特殊的信息,可以附加强制的延迟,类似于现在微信之中的撤销信息的操作,并且,在EOS中,是可以定义延迟的时间的。

    这是考虑到私钥可能会被滥用的情况,智能合约的开发者,可以在程序之中设定,要求某些消息被包含到区块中之后,必须等待一段特定的时间才可以被实际应用。比如,买卖房子的信息,可以在72小时的清算周期之后,才会实际执行,在此之前,信息可以被取消。
    这一强制延迟信息的特性,我认为会在之后开发基于EOS的电商交易系统时候,非常有用。不过,有一种情况在白皮书中没有讲到,就是如果交易的买方在发起了交易之后,在延迟的时间之内,卖方又把房产交易的信息撤回了,那么,该当如何操作?

    这里涉及到的是一个博弈的过程了。比如说,在买卖房产的过程之中,如果卖方作弊,在买方发起了转账交易之后,却在实际执行之前将房产易手的信息撤回,那么,买方也会有同样的权力将转账的交易信息撤回,以此情况下,双方都是不确定的博弈。至于最终如何解决这个问题,应该会有进一步的解释。

    交易的验证

    根据白皮书的描述,一笔交易发出之后,通过p2p网络广播到全网之中,而受选成为区块生产者的节点,一般来说都是100%在线的,平均出块速度为3秒钟,平均1.5秒之后,会将这笔全网的其它的交易节点知晓这笔交易,可以确认99.99%的概率该笔交易被区块链接收了。

    在一些特殊的情况下,为了确保一个交易是不可逆转的,可以等待15个区块确认。根据EOS.IO软件的配置,在正常情况下15个区块确认平均需要45秒。

    对于单笔交易有效性的确定,主要应该是通过账户权限控制来设定的。只有对应的账号和对应的权限,才具有权力对某一笔交易进行签名。对交易的权限管理,最简单形式是检查交易之中是否具有所需的签名,也因此来确定这一笔交易是否有效。

    下一篇,会继续分析一下,EOS的账户管理和权限管理设定,以及区块的结构是如何组织的。

    相关文章

      网友评论

      • 8337ea5e8883:您好,看到您的文章质量非常高,想邀请您成为虫洞社区签约作者。虫洞社区是中美区块链技术学习社区。虫洞社区鼓励内容生产者产生高质量内容,并给予合理的回报,也希望能帮助内容消费者获得高质量的区块链内容,并让数字货币投资者获得有价值的投资洞见。同时,虫洞社区已经积累了大量的区块链深度从业者,便于作者建立个人品牌。不知道是否方便加您微信细聊?
        荆凯_EOS42:您好,我的微信是 shuke0327. 谢谢您的欣赏

      本文标题:EOS的交易结构

      本文链接:https://www.haomeiwen.com/subject/oagevxtx.html