Context 与 ChainEnv

快速开始中,我们已经看到了如何自定义一个 Execution,此处有两个参数, 一个是context,一个是ChainEnv,他们分别表示两个不同 的用途。

Context 表示与链外交互的上下文信息。 它包括 调用者地址传入的参数eventerror

  • 客户端调用者(即发起交易的人)传入的参数会以json的形式序列化,并按 string -> interface{} 这样map的方式存在 context 中。
    我们通过context获取 客户端调用者的密码学地址 和 调用者传入的参数。 从context 获取参数的时候可以以任意go基础类型 去获取参数。 如果参数类型为自定义的,则需要先通过context.Get(paramName)获取到 interface再自行转化。可以直接获取参数的类型有:
   common.Hash([32]byte)
   common.Address([20]byte)
   string
   []byte
   bool 
   int, int8, int16, int32, int64
   uint, uint8, uint16, uint32, uint64
   float32, float64
  • 同时如果需要向链外返回 event的时候, 也需要通过context来完成(ctx.EmitEvent(interface{}))。

ChainEnv 包含了所有链相关的一切环境组件,其中有 blockchainyudbtxpoolstateExecuteP2pNetwork。 可供开发者直接操作到框架底层的组件。