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")