GOVM后台的合约流程

发布的合约是一份golang的源码,节点在接收该合约时(其实接收的是交易,合约是交易的数据),会在节点本地创建一个文件夹,放置合约代码,然后创建对应的main函数,编译成一个可执行文件。合约的执行就是执行对应的可执行文件。
因为golang是跨平台的语言,GOVM整个都是golang开发的,所以它可以部署在大部分的系统上,包括windows、linux等(为避免不一致,要求必须为64位操作系统)。

创建合约流程

  1. 编写代码:根据合约的功能,完成相应代码的开发。类似第二章的步骤。后续会增加离线调测的配套工具。
  2. 获取代币:通过挖矿或其他方式获取。
  3. 创建交易:通过浏览器发布相应的合约,govm完成的流程如下:
    • 读取源码
    • 分离import模块
    • 统计代码行数
    • 生成合约代码
    • 封装到交易里
    • 交易签名
    • 发送交易
    • 交易本地验证
    • 广播交易
    • 页面显示合约的名字
  4. 矿工节点打包交易(挖矿):接受交易,验证交易,将交易打包进区块里,广播生成的区块。
  5. 节点接受区块并验证(合约本地生成的步骤):
    • 将交易中的合约代码提取出来
    • 根据规则生成合约名字(默认为代码的哈希值)
    • 创建合约的文件夹(chain*文件夹里,以合约名字为文件夹名字)
    • 将源码放到文件夹里(会自动增加费用消耗的代码)
    • 增加main函数调用合约的run函数,编译成可执行文件,并放到合约文件夹里,然后删除main。

执行合约流程

  1. 如果合约有配套的操作页面,建议使用对应的操作页面。
  2. 获取代币
  3. 创建执行合约的交易:
  4. 交易被打包进区块
  5. 区块验证(处理交易):
    • 按照交易中的信息,扣掉调用者(用户)对应的代币
    • 验证合约是否存在,是否可执行
    • 将用户地址、合约参数、金额(花费的代币)传给合约可执行文件
    • 合约作为子进程执行(解析参数,校验金额,读写数据库等等)
    • 如果一切正常,合约将正常退出。
    • 如果异常,将自动回滚数据,删除区块。