注册自定义oracle

时间:2017-08-06 23:50:06

标签: corda

我已经关注了corda文档中的oracle示例,为我们的cordapp设置了一个简单的价格oracle,但是在我们的cordapp中注册这个oracles服务时遇到了问题。

我们的主要代码中显示的错误是

  

java.lang.IllegalArgumentException:Corda服务com.secLendModel.flow.oracle.Oracle不存在

通过跟踪此错误,似乎这是因为在我们的oracle的构造函数中,下面的代码段抛出一个空指针异常,尽管该服务似乎存在于我们的主测试代码中(即当我打印时) oracles宣传的服务,com.secLendModel.flow.oracle.Oracle是它宣传的唯一服务)

constructor(services: PluginServiceHub) : this(services.myInfo.serviceIdentities(PriceType.type).first(), services)

此构造函数代码的错误显示在节点启动

W 09:45:34 1 Node.invoke - com.secLendModel.flow.oracle.Oracle does not have a type field, optimistically proceeding with install.
E 09:45:34 1 Node.installCordaServices - Corda service com.secLendModel.flow.oracle.Oracle failed to instantiate
java.util.NoSuchElementException: List is empty.
at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:178) ~[kotlin-stdlib-1.1.1.jar:1.1.1]
at com.secLendModel.flow.oracle.Oracle.<init>(Oracle.kt:24) ~[main/:?]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_131]
at net.corda.node.internal.AbstractNode.installCordaService(AbstractNode.kt:322) ~[corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode.installCordaServices(AbstractNode.kt:302) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode.access$installCordaServices(AbstractNode.kt:99) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode$start$3.invoke(AbstractNode.kt:254) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode$start$3.invoke(AbstractNode.kt:99) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence$3.invoke(AbstractNode.kt:597) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence$3.invoke(AbstractNode.kt:99) [corda-node-0.13.0.jar:?]
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:69) [exposed-0.5.0.jar:?]
at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:57) [exposed-0.5.0.jar:?]
at net.corda.node.utilities.DatabaseSupportKt.transaction(DatabaseSupport.kt:48) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode.initialiseDatabasePersistence(AbstractNode.kt:596) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.Node.initialiseDatabasePersistence(Node.kt:304) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.AbstractNode.start(AbstractNode.kt:223) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.Node.start(Node.kt:310) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.NodeStartup.startNode(NodeStartup.kt:103) [corda-node-0.13.0.jar:?]
at net.corda.node.internal.NodeStartup.run(NodeStartup.kt:81) [corda-node-0.13.0.jar:?]
at net.corda.node.Corda.main(Corda.kt:11) [corda-node-0.13.0.jar:?]

看来这个节点设置发生在install corda服务下的abstractNode类中。我不确定这可能是一个错误,PluginServiceHub现在已经被删除或者我在节点设置中缺少一个步骤这个问题。

用于设置节点的代码如下

val oracle = startNode(ORACLE, advertisedServices = setOf(ServiceInfo(PriceType.type)))
oracleNode = oracle.get()
//This is what is reporting as empty when instantiating the node, but its definetely not. Could be something to do with abstractNode
println(oracleNode.nodeInfo.serviceIdentities(PriceType.type).first())
setUpNodes()

应该注意的是,一旦设置了所有节点,oracle节点就会显示没有服务

  

CN = Oracle SP,O = Oracle SP,L =布里斯班,C = AU在localhost:20018上启动

虽然我们的公证节点确实显示了服务

  

CN =公证服务,O = R3,OU = corda,L =苏黎世,C = CH,OU = corda.notary.validating在localhost:20009上开始

我们的oracle的代码遵循示例代码,它似乎没有任何问题,但我可以发布,如果需要。

1 个答案:

答案 0 :(得分:0)

这是来自Corda的较旧版本,该版本具有oracle等服务的服务身份的概念。

错误消息表明此行上引发了异常:

`println(oracleNode.nodeInfo.serviceIdentities(PriceType.type).first())`

特别是,它表示您正在尝试从没有元素的列表中获取第一项,因此PriceType.type服务标识未正确注册。

您可能无法在节点的node.conf文件中注册服务标识。