Kotlin Corda持久性:未知实体:PersistentFungibleToken 一般说明

Kotlin Corda持久性:未知实体:PersistentFungibleToken 一般说明,kotlin,corda,Kotlin,Corda,你好 我正在试用corda 4.3版token SDK 1.1版,并想尝试各种发行/兑换自定义可替换代币的场景 我编写了一个简单的流程,描述了一方对自己的令牌发行: 虽然非常基本的流似乎工作正常,但在子流(IssueTokensFlow)的中断中,试图将PersistentFungibleToken保存到数据库中(下面是堆栈跟踪)。 我尝试实现自己的模式,但没有成功,因为函数supportedScema()只需要列表。 我还尝试在不使用定制的FungilbeToken的情况下发行一些代币,但也没

你好
我正在试用corda 4.3版token SDK 1.1版,并想尝试各种发行/兑换自定义可替换代币的场景

我编写了一个简单的流程,描述了一方对自己的令牌发行:
虽然非常基本的流似乎工作正常,但在子流(IssueTokensFlow)的中断中,试图将PersistentFungibleToken保存到数据库中(下面是堆栈跟踪)。 我尝试实现自己的模式,但没有成功,因为函数supportedScema()只需要列表。
我还尝试在不使用定制的FungilbeToken的情况下发行一些代币,但也没有成功。
如何解决这个问题


进口公司paralleluniverse.fibers.Suspendable
导入com.maker.loyalty.states.NativeToken
导入com.maker.loyalty.states.ParticipantNativeFungibleToken
导入com.r3.corda.lib.tokens.contracts.states.FungibleToken
导入com.r3.corda.lib.tokens.contracts.utilities.heldBy
导入com.r3.corda.lib.tokens.contracts.utilities.of
导入com.r3.corda.lib.tokens.workflows.issue.IssueTokensFlow
导入com.r3.corda.lib.tokens.workflows.utilities.getPreferredNotary
导入net.corda.core.flows*
导入net.corda.core.identity.CordaX500Name
导入net.corda.core.identity.Party
导入net.corda.core.transactions.SignedTransaction
导入net.corda.core.utilities.ProgressTracker
实物实验{
private fun tracker()=ProgressTracker(
NotaryInfo,
创建事务,
验证
最后确定,
ExchangeValuesSingleParty.ExecuteExchange,
由另一方签署
)
私有const val defaultAmount:Long=2
private val otherPartyDefaultName=CordaX500Name(organization=“PartyA”,locality=“London”,country=“GB”)
//场景-在分类账上发放代币,验证是否发放了代币
@启动流
@星表
/**
*向自身发出令牌,并通知对方发出令牌
* */
类IssuEnabletOkenToSelfInitializer(私有val金额:Long=defaultAmount,
private val otherPartyX500Name:CordaX500Name=otherPartyDefaultName):FlowLogic(){
重写val progressTracker:progressTracker=tracker()
@暂停
重写趣味调用():SignedTransaction{
progressTracker.currentStep=NotaryInfo
GetPreferred公证人(serviceHub)
val otherParty:Party=run{
serviceHub.networkMapCache.getPeerByLegalName(otherPartyX500Name)
?:抛出流异常(“未找到另一方”)
}
val otherPartySession=initiateFlow(其他方)
progressTracker.currentStep=CreateTransaction
val issuedSupplyAmount=由我们的身份签发的国家通行证
val supplyAmount=已发行的supplyAmount的金额
//val负债=供应量由我们提供
val participantNativeAccountState=ParticipantNativeFungibleToken(
金额=供应量,
发行人=身份,
参与者=名单(我们的身份,另一方),
Observators=emptyList(),
所有者=身份
)
返回子流(IssueTokensFlow(
token=参与者的NativeAccountState作为可替换项,
participantSessions=listOf(otherPartySession)
))
}
}
}
堆栈跟踪 代币
import com.maker.loyalty.contracts.participant本地帐户合同
导入com.maker.loyalty.schemas.ParticipantNativeTokenSchemaV1
导入com.r3.corda.lib.tokens.contracts.internal.schemas.FungibleTokenSchema
导入com.r3.corda.lib.tokens.contracts.internal.schemas.FungibleTokenSchemaV1
导入com.r3.corda.lib.tokens.contracts.internal.schemas.PersistentFungibleToken
导入com.r3.corda.lib.tokens.contracts.states.FungibleToken
导入com.r3.corda.lib.tokens.contracts.types.IssuedTokenType
导入com.r3.corda.lib.tokens.contracts.types.TokenType
进口净额.corda.core.contracts.Amount
导入net.corda.core.contracts.BelongsToContract
导入net.corda.core.identity.AbstractParty
导入net.corda.core.identity.Party
导入net.corda.core.schemas.MappedSchema
导入net.corda.core.schemas.PersistentState
导入net.corda.core.schemas.QueryableState
导入net.corda.core.serialization.CordaSerializable
导入java.util*
@BelongsToContract(ParticipantNativeAccountContract::class)
数据类ParticipantNativeFungibleToken(覆盖val金额:金额,
撤销val颁发者:一方,
val所有者:党,
val观察员:List=listOf(),
覆盖val参与者:列表=(mutableListOf(所有者、颁发者)+观察者)
):FungibleToken(金额、发行人)、QueryableState{
重写fun generateMappedObject(架构:MappedSchema):PersistentState{
返回时(架构){
是否为FungibleTokeSchemav1->PersistentFungibleToken(
发行人=发行人,
tokenIdentifier=amount.token.tokenIdentifier,
持有者=所有者,
tokenClass=amount.token.tokenClass,
数量=数量
)
//是否为ParticipantNativeTokenSchemaV1->ParticipantNativeTokenSchemaV1.PersistentParticipantNativeTokenSchemav1(
//发行人=发行人,
//tokenIdentifier=amount.token.tokenIdentifier,
//持有者=所有者,
//tokenClass=amount.token.tokenClass,
//数量=数量
//            )
else->抛出IllegalArgumentException(“无法识别的架构$schema”)
}
}
超级趣味

java.lang.IllegalArgumentException: Unknown entity: com.r3.corda.lib.tokens.contracts.internal.schemas.PersistentFungibleToken
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Unknown entity: com.r3.corda.lib.tokens.contracts.internal.schemas.PersistentFungibleToken
    at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908)
    at net.corda.core.internal.concurrent.CordaFutureImpl.get(CordaFutureImpl.kt)
    at com.maker.loyalty.TwoPartyCoreTests.Create token test EXPERIMENT(TwoPartyCoreTests.kt:91)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
    at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Unknown entity: com.r3.corda.lib.tokens.contracts.internal.schemas.PersistentFungibleToken
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:807)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:788)
    at net.corda.node.services.schema.PersistentStateService.persistStatesWithSchema$node(PersistentStateService.kt:48)
    at net.corda.node.services.schema.PersistentStateService.persist(PersistentStateService.kt:40)
    at net.corda.node.services.vault.NodeVaultService.processAndNotify(NodeVaultService.kt:393)
    at net.corda.node.services.vault.NodeVaultService.access$processAndNotify(NodeVaultService.kt:54)
    at net.corda.node.services.vault.NodeVaultService$notifyAll$1.invoke(NodeVaultService.kt:224)
    at net.corda.node.services.vault.NodeVaultService$notifyAll$2.invoke(NodeVaultService.kt:235)
    at net.corda.node.services.vault.NodeVaultService.notifyAll(NodeVaultService.kt:239)
    at net.corda.node.services.api.ServiceHubInternal$Companion$recordTransactions$1.invoke(ServiceHubInternal.kt:128)
    at net.corda.node.services.api.ServiceHubInternal$Companion$recordTransactions$1.invoke(ServiceHubInternal.kt:53)
    at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:235)
    at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:214)
    at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:220)
    at net.corda.node.services.api.ServiceHubInternal$Companion.recordTransactions(ServiceHubInternal.kt:72)
    at net.corda.node.services.api.ServiceHubInternal$DefaultImpls.recordTransactions(ServiceHubInternal.kt:158)
    at net.corda.node.internal.AbstractNode$ServiceHubInternalImpl.recordTransactions(AbstractNode.kt:1008)
    at net.corda.core.node.ServiceHub$DefaultImpls.recordTransactions(ServiceHub.kt:214)
    at net.corda.core.internal.ServiceHubCoreInternal$DefaultImpls.recordTransactions(ServiceHubCoreInternal.kt)
    at net.corda.node.services.api.ServiceHubInternal$DefaultImpls.recordTransactions(ServiceHubInternal.kt)
    at net.corda.node.internal.AbstractNode$ServiceHubInternalImpl.recordTransactions(AbstractNode.kt:1008)
    at net.corda.core.node.ServiceHub$DefaultImpls.recordTransactions(ServiceHub.kt:206)
    at net.corda.core.internal.ServiceHubCoreInternal$DefaultImpls.recordTransactions(ServiceHubCoreInternal.kt)
    at net.corda.node.services.api.ServiceHubInternal$DefaultImpls.recordTransactions(ServiceHubInternal.kt)
    at net.corda.node.internal.AbstractNode$ServiceHubInternalImpl.recordTransactions(AbstractNode.kt:1008)
    at net.corda.core.flows.FinalityFlow.notariseAndRecord(FinalityFlow.kt:205)
    at net.corda.core.flows.FinalityFlow.call(FinalityFlow.kt:147)
    at net.corda.core.flows.FinalityFlow.call(FinalityFlow.kt:39)
    at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(FlowStateMachineImpl.kt:330)
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:326)
    at com.r3.corda.lib.tokens.workflows.internal.flows.finality.ObserverAwareFinalityFlow.call(ObserverAwareFinalityFlow.kt:75)
    at com.r3.corda.lib.tokens.workflows.internal.flows.finality.ObserverAwareFinalityFlow.call(ObserverAwareFinalityFlow.kt:35)
    at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(FlowStateMachineImpl.kt:330)
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:326)
    at com.r3.corda.lib.tokens.workflows.flows.issue.IssueTokensFlow.call(IssueTokensFlow.kt:84)
    at com.r3.corda.lib.tokens.workflows.flows.issue.IssueTokensFlow.call(IssueTokensFlow.kt:46)
    at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(FlowStateMachineImpl.kt:330)
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:326)
    at com.maker.loyalty.flows.IssueTokenExperiment$IssueNativeTokenToSelfInitializer.call(IssueTokenExperiment.kt:64)
    at com.maker.loyalty.flows.IssueTokenExperiment$IssueNativeTokenToSelfInitializer.call(IssueTokenExperiment.kt:37)
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:270)
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:46)
    at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092)
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)
    at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100)
    at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:63)
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.quasar-utils'

cordapp {
    targetPlatformVersion corda_platform_version
    minimumPlatformVersion corda_platform_version
    workflow {
        name "Loyalty Flows"
        versionId 1
    }
}

sourceSets {
    main {
        resources {
            srcDir rootProject.file("config/dev")
        }
    }
    test {
        resources {
            srcDir rootProject.file("config/test")
        }
    }
    integrationTest {
        kotlin {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integrationTest/kotlin')
        }
    }
}

repositories {
    maven { url 'https://ci-artifactory.corda.r3cev.com/artifactory/corda-lib' }
    maven { url 'https://ci-artifactory.corda.r3cev.com/artifactory/corda-lib-dev' }
}

configurations {
    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
    testCompile "junit:junit:$junit_version"

    // Corda dependencies.
    cordaCompile "$corda_release_group:corda-core:$corda_release_version"
    cordaRuntime "$corda_release_group:corda:$corda_release_version"
    cordaCompile "$tokens_release_group:tokens-workflows:$tokens_release_version"
    testCompile "$corda_release_group:corda-node-driver:$corda_release_version"
    //tokens sdk
    cordaCompile "$tokens_release_group:tokens-workflows:$tokens_release_version"
    cordaCompile "$tokens_release_group:tokens-money:$tokens_release_version"
    cordapp "$tokens_release_group:tokens-selection:$tokens_release_version"

    // CorDapp dependencies.
    cordapp project(":contracts")
}

task integrationTest(type: Test, dependsOn: []) {
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
}
cordapp("$tokens_release_group:tokens-contracts:$tokens_release_version")