add custodian to gameCreate and accept trx

This commit is contained in:
djmil 2023-11-28 20:17:01 +01:00
parent f7589aa3bc
commit e7f78b01ff
3 changed files with 39 additions and 21 deletions

View File

@ -7,6 +7,7 @@ import java.util.UUID;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import djmil.cordacheckers.VNode;
import djmil.cordacheckers.contracts.GameCommand; import djmil.cordacheckers.contracts.GameCommand;
import djmil.cordacheckers.gamestate.CommitTrx; import djmil.cordacheckers.gamestate.CommitTrx;
import djmil.cordacheckers.gamestate.FlowResponce; import djmil.cordacheckers.gamestate.FlowResponce;
@ -21,16 +22,21 @@ import net.corda.v5.application.flows.ClientStartableFlow;
import net.corda.v5.application.flows.CordaInject; import net.corda.v5.application.flows.CordaInject;
import net.corda.v5.application.flows.FlowEngine; import net.corda.v5.application.flows.FlowEngine;
import net.corda.v5.application.marshalling.JsonMarshallingService; import net.corda.v5.application.marshalling.JsonMarshallingService;
import net.corda.v5.application.membership.MemberLookup;
import net.corda.v5.base.annotations.Suspendable; import net.corda.v5.base.annotations.Suspendable;
import net.corda.v5.crypto.SecureHash; import net.corda.v5.crypto.SecureHash;
import net.corda.v5.ledger.utxo.StateAndRef; import net.corda.v5.ledger.utxo.StateAndRef;
import net.corda.v5.ledger.utxo.UtxoLedgerService; import net.corda.v5.ledger.utxo.UtxoLedgerService;
import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction; import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction;
import net.corda.v5.membership.MemberInfo;
public class AcceptFlow implements ClientStartableFlow{ public class AcceptFlow implements ClientStartableFlow{
private final static Logger log = LoggerFactory.getLogger(AcceptFlow.class); private final static Logger log = LoggerFactory.getLogger(AcceptFlow.class);
@CordaInject
public MemberLookup memberLookup;
@CordaInject @CordaInject
public JsonMarshallingService jsonMarshallingService; public JsonMarshallingService jsonMarshallingService;
@ -47,6 +53,7 @@ public class AcceptFlow implements ClientStartableFlow{
try { try {
final GameCommand command = new GameCommand(GameCommand.Action.GAME_PROPOSAL_ACCEPT); final GameCommand command = new GameCommand(GameCommand.Action.GAME_PROPOSAL_ACCEPT);
final MemberInfo custodianInfo = findCustodian();
final UUID gameUuid = UUID.fromString(requestBody.getRequestBody()); final UUID gameUuid = UUID.fromString(requestBody.getRequestBody());
@ -66,7 +73,10 @@ public class AcceptFlow implements ClientStartableFlow{
.toSignedTransaction(); .toSignedTransaction();
utxoTrxId = this.flowEngine utxoTrxId = this.flowEngine
.subFlow(new CommitTrx(gameProposalAcceptTrx, gameProposal.getIssuerName())); .subFlow(new CommitTrx(gameProposalAcceptTrx,
gameProposal.getIssuerName(),
custodianInfo.getName()
));
final View gameView = this.flowEngine final View gameView = this.flowEngine
.subFlow(new ViewBuilder(utxoTrxId)); .subFlow(new ViewBuilder(utxoTrxId));
@ -81,4 +91,13 @@ public class AcceptFlow implements ClientStartableFlow{
} }
} }
@Suspendable
MemberInfo findCustodian() {
return memberLookup.lookup()
.stream()
.filter(member -> VNode.isCordaCherckersCustodian(member) )
.reduce((a,b) -> {throw new IllegalStateException("Multiple Custodian VNodes");})
.orElseThrow( () -> new IllegalStateException("No Custodian VNode found"));
}
} }

View File

@ -59,8 +59,9 @@ public class CreateFlow implements ClientStartableFlow{
try { try {
final GameCommand command = new GameCommand(GameCommand.Action.GAME_PROPOSAL_CREATE); final GameCommand command = new GameCommand(GameCommand.Action.GAME_PROPOSAL_CREATE);
final MemberInfo custodianInfo = findCustodian();
final GameProposalState gameProposal = buildGameProposalStateFrom(requestBody); final GameProposalState gameProposal = buildGameProposalStateFrom(requestBody, custodianInfo);
final UtxoSignedTransaction gameProposalCreateTrx = utxoLedgerService.createTransactionBuilder() final UtxoSignedTransaction gameProposalCreateTrx = utxoLedgerService.createTransactionBuilder()
.addCommand(command) .addCommand(command)
@ -71,7 +72,10 @@ public class CreateFlow implements ClientStartableFlow{
.toSignedTransaction(); .toSignedTransaction();
utxoTrxId = this.flowEngine utxoTrxId = this.flowEngine
.subFlow(new CommitTrx(gameProposalCreateTrx, gameProposal.getAcquierName())); .subFlow(new CommitTrx(gameProposalCreateTrx,
gameProposal.getAcquierName(),
custodianInfo.getName()
));
final View gameView = this.flowEngine final View gameView = this.flowEngine
.subFlow(new ViewBuilder(utxoTrxId)); .subFlow(new ViewBuilder(utxoTrxId));
@ -87,7 +91,7 @@ public class CreateFlow implements ClientStartableFlow{
} }
@Suspendable @Suspendable
GameProposalState buildGameProposalStateFrom(ClientRequestBody requestBody) { GameProposalState buildGameProposalStateFrom(ClientRequestBody requestBody, MemberInfo custodiaInfo) {
final CreateFlowArgs args = requestBody.getRequestBodyAs(jsonMarshallingService, CreateFlowArgs.class); final CreateFlowArgs args = requestBody.getRequestBodyAs(jsonMarshallingService, CreateFlowArgs.class);
final MemberInfo myInfo = memberLookup.myInfo(); final MemberInfo myInfo = memberLookup.myInfo();
@ -108,7 +112,8 @@ public class CreateFlow implements ClientStartableFlow{
args.message, args.message,
Arrays.asList( Arrays.asList(
myInfo.getLedgerKeys().get(0), myInfo.getLedgerKeys().get(0),
opponentInfo.getLedgerKeys().get(0)) opponentInfo.getLedgerKeys().get(0),
custodiaInfo.getLedgerKeys().get(0))
); );
} }
@ -121,4 +126,13 @@ public class CreateFlow implements ClientStartableFlow{
.orElseThrow( () -> new IllegalStateException("No Notary VNode found")); .orElseThrow( () -> new IllegalStateException("No Notary VNode found"));
} }
@Suspendable
MemberInfo findCustodian() {
return memberLookup.lookup()
.stream()
.filter(member -> VNode.isCordaCherckersCustodian(member) )
.reduce((a,b) -> {throw new IllegalStateException("Multiple Custodian VNodes");})
.orElseThrow( () -> new IllegalStateException("No Custodian VNode found"));
}
} }

View File

@ -7,7 +7,6 @@ import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import djmil.cordacheckers.VNode;
import net.corda.v5.application.flows.CordaInject; import net.corda.v5.application.flows.CordaInject;
import net.corda.v5.application.flows.InitiatingFlow; import net.corda.v5.application.flows.InitiatingFlow;
import net.corda.v5.application.flows.SubFlow; import net.corda.v5.application.flows.SubFlow;
@ -19,7 +18,6 @@ import net.corda.v5.base.types.MemberX500Name;
import net.corda.v5.crypto.SecureHash; import net.corda.v5.crypto.SecureHash;
import net.corda.v5.ledger.utxo.UtxoLedgerService; import net.corda.v5.ledger.utxo.UtxoLedgerService;
import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction; import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction;
import net.corda.v5.membership.MemberInfo;
@InitiatingFlow(protocol = "gamestate-commit") @InitiatingFlow(protocol = "gamestate-commit")
public class CommitTrx implements SubFlow<SecureHash> { public class CommitTrx implements SubFlow<SecureHash> {
@ -27,7 +25,7 @@ public class CommitTrx implements SubFlow<SecureHash> {
private final static Logger log = LoggerFactory.getLogger(CommitTrx.class); private final static Logger log = LoggerFactory.getLogger(CommitTrx.class);
private final UtxoSignedTransaction utxTrxCandidate; private final UtxoSignedTransaction utxTrxCandidate;
private final MemberX500Name counterpartyName; private final MemberX500Name counterpartyName;
private /*final*/ MemberX500Name custodyName; private final MemberX500Name custodyName;
public CommitTrx(UtxoSignedTransaction signedTransaction, MemberX500Name counterpartyName) { public CommitTrx(UtxoSignedTransaction signedTransaction, MemberX500Name counterpartyName) {
this.utxTrxCandidate = signedTransaction; this.utxTrxCandidate = signedTransaction;
@ -63,11 +61,6 @@ public class CommitTrx implements SubFlow<SecureHash> {
final FlowSession session = flowMessaging.initiateFlow(this.counterpartyName); final FlowSession session = flowMessaging.initiateFlow(this.counterpartyName);
List<FlowSession> sessionsList = new LinkedList<FlowSession>(Arrays.asList(session)); List<FlowSession> sessionsList = new LinkedList<FlowSession>(Arrays.asList(session));
if (custodyName == null) {
custodyName = findCustodian().getName();
log.info("GameState: [UGLY FIX] backchain validation failure for custodian");
}
if (custodyName != null) { if (custodyName != null) {
sessionsList.add(flowMessaging.initiateFlow(custodyName)); sessionsList.add(flowMessaging.initiateFlow(custodyName));
} }
@ -81,12 +74,4 @@ public class CommitTrx implements SubFlow<SecureHash> {
return trxId; return trxId;
} }
@Suspendable
MemberInfo findCustodian() {
return memberLookup.lookup()
.stream()
.filter(member -> VNode.isCordaCherckersCustodian(member) )
.reduce((a,b) -> {throw new IllegalStateException("Multiple Custodian VNodes");})
.orElseThrow( () -> new IllegalStateException("No Custodian VNode found"));
}
} }