흐름 -현금 계약 검증
계약 검증이 실패 오류 메시지를 제공 : 실패 요구 사항 : 발행에서 참조 [01]에 대한 C가 미국 = , L = 뉴욕, O = PartyB 양의 균형! 300000-0 = 0, 계약 : [email protected]는
사실 그 때문이다 나타납니다 입력 된 현금 금액은 출력 + 원장을 나가는 금액과 동일하지 않습니다.
"for reference ${issuer.reference} at issuer ${issuer.party} the amounts balance: ${inputAmount.quantity} - ${amountExitingLedger.quantity} != ${outputAmount.quantity}" using
(inputAmount == outputAmount + amountExitingLedger)
그러나 나는 단순히 Cash.generateSpend() 함수를 사용하고있는 트랜잭션 내에서 현금 상태를 생성하는, 그래서 나는이 오류가 발생할 수 수 있는지 모르겠습니다. 사용되는 현금은 시뮬레이션이 시작될 때 자체 발행되며이 문제를 일으키는 플로우가 호출되기 전에 노드간에 이동되었을 수 있습니다.
현금 상태의 정확한 값을 볼 수는 없지만 2 가지 상태가 있음을 알 수 있습니다. 현금의 산출량은 지출 된 금액 (3102 달러)과 당 3,020 달러를 소비하는 다른 두 주 (97991898 달러와 97995000 달러 중 하나)입니다. 파티는 시뮬레이션 시작시 원래 98000000 달러가 발행되었으므로이 세 번째 출력 상태는 $ 97995000이므로 매우 이상하게 보입니다. $ 97991898 + $ 3102 = $ 97995000 이래로 두 입력 상태가 $ 97995000에 이르고이 파티가 이미 다른 흐름에서 $ 5000을 소비 했으므로이 세 번째 현금 출력은 97995000 달러로 보이지 않는 것처럼 보입니다.
이 문제는 Cash.generateSpend()에서 문제가 발생할 수 있습니까? 현금의 다른 입력 또는 출력 상태를 추가하지 않을 것입니다 (아래에 흐름을 첨부했습니다). 또한이 문제는 5000 달러를 지출하는 흐름을 허용하는 경우에만 발생합니다 (즉, 파티 A는 B 달러 5,000 원을 지불하고 원장에 기록한 다음 여기 B에 별도의 결제를 시도합니다).
//STEP 4: Build the transaction
val notary = serviceHub.networkMapCache.notaryIdentities.first()
val builder = TransactionBuilder(notary)
val builder2 = TermDeposit().generateRedeem(builder, TermDeposit)
//Add our required cash
val (tx, cashKeys) = Cash.generateSpend(serviceHub, builder2, Amount((TermDeposit.state.data.depositAmount.quantity * (100+TermDeposit.state.data.interestPercent)/100).toLong(), USD), flow.counterparty)
println("Redeem added cash ${Amount((TermDeposit.state.data.depositAmount.quantity * (100+TermDeposit.state.data.interestPercent)/100).toLong(), USD)}")
//STEP 5: Get the client to sign the transaction
println("Inputs ${tx.inputStates()}")
println("Outputs ${tx.outputStates()}")
val partSignedTxn = serviceHub.signInitialTransaction(tx, cashKeys)
println("Before collect sigs")
val otherPartySig = subFlow(CollectSignaturesFlow(partSignedTxn, listOf(flow), CollectSignaturesFlow.tracker()))
println("after collect sigs")
//STEP 6: Merge all signatures and commit this to the ledger
val twiceSignedTx = partSignedTxn.plus(otherPartySig.sigs)
println("Redeem before finality flow")
return subFlow(FinalityFlow(twiceSignedTx))
나는이 질문은 끝이 매우 열려 알고 있지만, 내가 잘못 갈 수있는 지역에있는 모든 포인터는 크게 감상 할 수있다.