【问题标题】:How to create custom schema with Corda Vault Extension如何使用 Corda Vault Extension 创建自定义架构
【发布时间】:2018-07-11 17:02:48
【问题描述】:

从 Corda 文档中,它说我们可以在 Vault Extension 中拥有自定义架构。

但是对于 Vault Extension,它应该能够创建/管理与节点 Vault 数据库相关的自定义数据库架构并没有太多明确性。

我们会在 Corda 的功能版本中发布 API

【问题讨论】:

    标签: database-schema corda


    【解决方案1】:

    在流内部,节点公开了一个 JDBC 连接,允许您编写本机自定义 SQL 查询(作为保险库扩展)。您可以使用 serviceHub.jdbcSession() 访问此 JDBC 连接。

    如果您的问题是关于如何编写自定义架构,请参阅现有的 Corda Persistence API 文档。

    然后您可以使用新的 Vault Query API 查询该自定义架构 - 请参阅现有的 [Corda Vault Query API][3] 文档。

    【讨论】:

      【解决方案2】:

      只是在上面添加一个示例,这里是 Yo! CorDapp。请参阅下面的YoSchemaV1

      // State.
      data class State(val origin: Party,
                       val target: Party,
                       val yo: String = "Yo!") : ContractState, QueryableState {
          override val participants get() = listOf(target)
          override val contract get() = Yo()
          override fun toString() = "${origin.name}: $yo"
          override fun supportedSchemas() = listOf(YoSchemaV1)
          override fun generateMappedObject(schema: MappedSchema) = YoSchemaV1.YoEntity(this)
      
          object YoSchemaV1 : MappedSchema(Yo.State::class.java, 1, listOf(YoEntity::class.java)) {
              @Entity @Table(name = "yos")
              class YoEntity(yo: State) : PersistentState() {
                  @Column var origin: String = yo.origin.name.toString()
                  @Column var target: String = yo.target.name.toString()
                  @Column var yo: String = yo.yo
              }
          }
      }
      

      简而言之,你的状态对象需要实现QueryableState,如上。

      完整的 CorDapp 可在此处获得:https://github.com/roger3cev/yo-cordapp

      干杯

      【讨论】:

      • 感谢 Roger,在发布之前,我通过查看 CashSchema.V1 的核心代码使用 MappedSchema 接口创建了模式 :) 但后来我面临着在插件注册表中注册模式的挑战,跨度>
      • 嗨,罗杰,我已经实现了类似于 Yo 模式的示例,但现在我要对此进行测试,然后出现一些序列化错误。我在节点的插件注册表中也添加了序列化,但后来我得到了一些堆栈溢出错误,下面是堆栈跟踪
      • SerializationCustomization 定制 = new SerializationCustomization() { @Override public void addToWhitelist(Class> aClass) { //this.addToWhitelist(aClass); if(!aClass.isInstance(PersistentStateRef.class)) { this.addToWhitelist(aClass); } } }; custom.addToWhitelist(net.corda.core.schemas.PersistentStateRef.class); node.getPluginRegistries().get(0).customizeSerialization(customization);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多