Skip to content

Commit

Permalink
feat(satp-hermes): satp development continuation and implementation s…
Browse files Browse the repository at this point in the history
…atp protocol (#3397)

Signed-off-by: Carlos Amaro <carlosrscamaro@tecnico.ulisboa.pt>
  • Loading branch information
LordKubaya authored and RafaelAPB committed Aug 14, 2024
1 parent 036113f commit 04a09a6
Show file tree
Hide file tree
Showing 32 changed files with 3,457 additions and 2,035 deletions.
2 changes: 2 additions & 0 deletions packages/cactus-plugin-satp-hermes/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,13 @@
"@hyperledger/cactus-common": "2.0.0-rc.2",
"@hyperledger/cactus-core": "2.0.0-rc.2",
"@hyperledger/cactus-core-api": "2.0.0-rc.2",
"@hyperledger/cactus-plugin-bungee-hermes": "2.0.0-rc.1",
"@hyperledger/cactus-plugin-keychain-memory": "2.0.0-rc.2",
"@hyperledger/cactus-plugin-ledger-connector-besu": "2.0.0-rc.2",
"@hyperledger/cactus-plugin-ledger-connector-fabric": "2.0.0-rc.2",
"@hyperledger/cactus-plugin-object-store-ipfs": "2.0.0-rc.2",
"@hyperledger/cactus-test-tooling": "2.0.0-rc.2",
"@openzeppelin/contracts": "4.4.0",
"axios": "1.6.0",
"body-parser": "1.20.2",
"class-transformer": "0.5.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ message TransferClaims {
string receiver_gateway_owner_id = 12;
uint32 max_retries = 13;
uint64 max_timeout = 14;
string amount_from_originator = 15;
string amount_to_beneficiary = 16;
}

message TransferClaimsFormat {
Expand Down Expand Up @@ -192,35 +194,40 @@ enum Error {
ERROR_MESSAGE_OUT_OF_SEQUENCE = 11;
}

message LockAssertionClaim {

}

message LockAssertionFormat {
message LockAssertionClaimFormat {

}

message MintAssertionClaims {
message MintAssertionClaimFormat {

}

message MintAssertionClaimsFormat {
message BurnAssertionClaimFormat {

}

message BurnAssertionClaim {
message AssignmentAssertionClaimFormat {

}

message BurnAssertionClaimFormat {

message LockAssertionClaim {
string receipt = 1;
string signature = 2;
}

message AssignmentAssertionClaim {

message MintAssertionClaim {
string receipt = 1;
string signature = 2;
}

message AssignmentAssertionClaimFormat {
message BurnAssertionClaim {
string receipt = 1;
string signature = 2;
}

message AssignmentAssertionClaim {
string receipt = 1;
string signature = 2;
}

Original file line number Diff line number Diff line change
Expand Up @@ -37,36 +37,40 @@ message SessionData {
string sender_gateway_owner_id = 27;
string receiver_gateway_owner_id = 28;
string hash_transfer_init_claims = 29;
string proposed_transfer_init_claims = 30;
cacti.satp.v02.common.SignatureAlgorithm signature_algorithm = 31;
cacti.satp.v02.common.LockType lock_type = 32;
uint64 lock_expiration_time = 33;
cacti.satp.v02.common.Permissions permissions = 34;
string developer_urn = 35;
cacti.satp.v02.common.CredentialProfile credential_profile = 36;
cacti.satp.v02.common.SubsequentCalls subsequent_calls = 37;
repeated cacti.satp.v02.common.History history = 38;
bool multiple_claims_allowed = 39;
bool multiple_cancels_allowed = 40;
string last_message_received_timestamp = 41;
MessageStagesTimestamps processed_timestamps = 42;
MessageStagesTimestamps received_timestamps = 43;
cacti.satp.v02.common.LockAssertionClaim lock_assertion_claim = 44;
cacti.satp.v02.common.LockAssertionFormat lock_assertion_format = 45;
cacti.satp.v02.common.MintAssertionClaims mint_assertion_claims = 46;
cacti.satp.v02.common.MintAssertionClaimsFormat mint_assertion_claims_format = 47;
cacti.satp.v02.common.BurnAssertionClaim burn_assertion_claim = 48;
cacti.satp.v02.common.BurnAssertionClaimFormat burn_assertion_claim_format = 49;
cacti.satp.v02.common.AssignmentAssertionClaim assignment_assertion_claim = 50;
cacti.satp.v02.common.AssignmentAssertionClaimFormat assignment_assertion_claim_format = 51;
bool completed = 52;
ACCEPTANCE acceptance = 53;
string last_message_hash = 54;
cacti.satp.v02.common.TransferClaimsFormat transfer_claims_format = 55;
cacti.satp.v02.common.TransferClaims transfer_init_claims = 30;
string proposed_transfer_init_claims = 31;
cacti.satp.v02.common.SignatureAlgorithm signature_algorithm = 32;
cacti.satp.v02.common.LockType lock_type = 33;
uint64 lock_expiration_time = 34;
cacti.satp.v02.common.Permissions permissions = 35;
string developer_urn = 36;
cacti.satp.v02.common.CredentialProfile credential_profile = 37;
cacti.satp.v02.common.SubsequentCalls subsequent_calls = 38;
repeated cacti.satp.v02.common.History history = 39;
bool multiple_claims_allowed = 40;
bool multiple_cancels_allowed = 41;
string last_message_received_timestamp = 42;
MessageStagesTimestamps processed_timestamps = 43;
MessageStagesTimestamps received_timestamps = 44;
cacti.satp.v02.common.LockAssertionClaim lock_assertion_claim = 45;
cacti.satp.v02.common.LockAssertionClaimFormat lock_assertion_claim_format = 46;
cacti.satp.v02.common.MintAssertionClaim mint_assertion_claim = 47;
cacti.satp.v02.common.MintAssertionClaimFormat mint_assertion_claim_format = 48;
cacti.satp.v02.common.BurnAssertionClaim burn_assertion_claim = 49;
cacti.satp.v02.common.BurnAssertionClaimFormat burn_assertion_claim_format = 50;
cacti.satp.v02.common.AssignmentAssertionClaim assignment_assertion_claim = 51;
cacti.satp.v02.common.AssignmentAssertionClaimFormat assignment_assertion_claim_format = 52;
bool completed = 53;
ACCEPTANCE acceptance = 54;
string last_message_hash = 55;
cacti.satp.v02.common.TransferClaimsFormat transfer_claims_format = 56;
string client_transfer_number = 57;
string server_transfer_number = 58;
string lock_assertion_expiration = 59;
cacti.satp.v02.common.AssetProfile asset_profile = 60;
}



message MessageStagesHashes {
Stage1Hashes stage1 = 1;
Stage2Hashes stage2 = 2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ message TransferCommenceRequestMessage {

message TransferCommenceResponseMessage {
cacti.satp.v02.common.CommonSatp common = 1;
string server_transfer_number = 2;
}

service SatpStage1Service {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import "cacti/satp/v02/common/message.proto";
message LockAssertionRequestMessage {
cacti.satp.v02.common.CommonSatp common = 1;
cacti.satp.v02.common.LockAssertionClaim lock_assertion_claim = 2;
cacti.satp.v02.common.LockAssertionFormat lock_assertion_format = 3;
cacti.satp.v02.common.LockAssertionClaimFormat lock_assertion_claim_format = 3;
string lock_assertion_expiration = 4;
string client_transfer_number = 5;
string client_signature = 6;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ message CommitPreparationRequestMessage {

message CommitReadyResponseMessage {
cacti.satp.v02.common.CommonSatp common = 1;
cacti.satp.v02.common.MintAssertionClaims mint_assertion_claims = 2;
cacti.satp.v02.common.MintAssertionClaimsFormat mint_assertion_claims_format = 3;
cacti.satp.v02.common.MintAssertionClaim mint_assertion_claim = 2;
cacti.satp.v02.common.MintAssertionClaimFormat mint_assertion_claim_format = 3;
string server_transfer_number = 4;
string server_signature = 5;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ import {
import { ExecuteGetStatus } from "./admin/get-status-handler-service";
import { ISATPManagerOptions, SATPManager } from "../gol/satp-manager";
import { GatewayOrchestrator } from "../gol/gateway-orchestrator";
import { SATPBridgesManager } from "../gol/satp-bridges-manager";

export interface BLODispatcherOptions {
logger: Logger;
logLevel?: LogLevelDesc;
instanceId: string;
orchestrator: GatewayOrchestrator;
signer: JsObjectSigner;
bridgesManager: SATPBridgesManager;
}

export class BLODispatcher {
Expand All @@ -36,6 +38,7 @@ export class BLODispatcher {
private readonly instanceId: string;
private manager: SATPManager;
private orchestrator: GatewayOrchestrator;
private bridgeManager: SATPBridgesManager;

constructor(public readonly options: BLODispatcherOptions) {
const fnTag = `${BLODispatcher.CLASS_NAME}#constructor()`;
Expand All @@ -50,11 +53,14 @@ export class BLODispatcher {
const signer = options.signer;
const ourGateway = this.orchestrator.ourGateway;

this.bridgeManager = options.bridgesManager;

const SATPManagerOpts: ISATPManagerOptions = {
logLevel: "DEBUG",
instanceId: ourGateway!.id,
signer: signer,
supportedDLTs: this.orchestrator.supportedDLTs,
bridgeManager: this.bridgeManager,
};

this.manager = new SATPManager(SATPManagerOpts);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
import { createPromiseClient } from "@connectrpc/connect";
import {
LogLevelDesc,
Logger,
LoggerProvider,
} from "@hyperledger/cactus-common";
import { SatpStage1Service } from "../generated/proto/cacti/satp/v02/stage_1_connect";
import { createConnectTransport } from "@connectrpc/connect-node";
import { SatpStage2Service } from "../generated/proto/cacti/satp/v02/stage_2_connect";
import { SatpStage3Service } from "../generated/proto/cacti/satp/v02/stage_3_connect";
import { SATPManager } from "../gol/satp-manager";
import { SATPSession } from "./satp-session";
import { SATPHandler } from "../types/satp-protocol";
import { Stage1SATPHandler } from "./stage-handlers/stage1-handler";
import { Stage2SATPHandler } from "./stage-handlers/stage2-handler";
import { Stage3SATPHandler } from "./stage-handlers/stage3-handler";

export interface ISenderSATPProtocolOptions {
logLevel?: LogLevelDesc;
serverPath: string;
sessionId: string;
satpManager: SATPManager;
}

export interface SATPTransferRequest {
sessionId: string;
}

export class SenderSATPProtocol {
public static readonly CLASS_NAME = "SenderSATPProtocol";

private satpManager: SATPManager;

readonly log: Logger;
constructor(private config: ISenderSATPProtocolOptions) {
this.log = LoggerProvider.getOrCreate({
label: SenderSATPProtocol.CLASS_NAME,
level: config.logLevel || "INFO",
});
this.satpManager = config.satpManager;
}

public async initiateTransfer(session: SATPSession): Promise<void> {
this.log.info(`Initiating Transfer`);
this.log.info(`Session: ${JSON.stringify(session)}`);

if (!session) {
throw new Error(`Session with id ${this.config.sessionId} not found`);
}

const transport = createConnectTransport({
baseUrl: this.config.serverPath,
httpVersion: "1.1",
});

const handlers = this.satpManager.getSATPHandlers(
session.getSessionData().id,
);

if (!handlers) {
throw new Error(
`No handlers found for session ${session.getSessionData().id}`,
);
}

const satpHandlers: Map<string, SATPHandler> = handlers;

const clientSatpStage1 = createPromiseClient(SatpStage1Service, transport);
const clientSatpStage2 = createPromiseClient(SatpStage2Service, transport);
const clientSatpStage3 = createPromiseClient(SatpStage3Service, transport);

const requestTransferProposal = await (
satpHandlers.get("Stage1SATPHandler") as Stage1SATPHandler
).TransferProposalRequest();

if (!requestTransferProposal) {
throw new Error(`Failed to create TransferProposalRequest`);
}

const responseTransferProposal = await clientSatpStage1.transferProposal(
requestTransferProposal,
);

this.log.info(
`responseTransferProposal: ${JSON.stringify(responseTransferProposal)}`,
);

const requestTransferCommence = await (
satpHandlers.get("Stage1SATPHandler") as Stage1SATPHandler
).TransferCommenceRequest(responseTransferProposal);

if (!requestTransferCommence) {
throw new Error(`Failed to create TransferCommenceRequest`);
}

const responseTransferCommence = await clientSatpStage1.transferCommence(
requestTransferCommence,
);

this.log.info(
`responseTransferCommence: ${JSON.stringify(responseTransferCommence)}`,
);

this.log.info(`Stage 1 completed`);

const requestLockAssertion = await (
satpHandlers.get("Stage2SATPHandler") as Stage2SATPHandler
).LockAssertionRequest(responseTransferCommence);

if (!requestLockAssertion) {
throw new Error(`Failed to create LockAssertionRequest`);
}

const responseLockAssertion =
await clientSatpStage2.lockAssertion(requestLockAssertion);

this.log.info(
`responseLockAssertion: ${JSON.stringify(responseLockAssertion)}`,
);

this.log.info(`Stage 2 completed`);

const requestCommitPreparation = await (
satpHandlers.get("Stage3SATPHandler") as Stage3SATPHandler
).CommitPreparationRequest(responseLockAssertion);

if (!requestCommitPreparation) {
throw new Error(`Failed to create CommitPreparationRequest`);
}

const responseCommitPreparation = await clientSatpStage3.commitPreparation(
requestCommitPreparation,
);
this.log.info(
`responseCommitPreparation: ${JSON.stringify(responseCommitPreparation)}`,
);

const requestCommitFinalAssertion = await (
satpHandlers.get("Stage3SATPHandler") as Stage3SATPHandler
).CommitFinalAssertionRequest(responseLockAssertion);

if (!requestCommitFinalAssertion) {
throw new Error(`Failed to create CommitFinalAssertionRequest`);
}

const responseCommitFinalAssertion =
await clientSatpStage3.commitFinalAssertion(requestCommitFinalAssertion);
this.log.info(
`responseCommitFinalAssertion: ${JSON.stringify(responseCommitFinalAssertion)}`,
);

const RequestTransferComplete = await (
satpHandlers.get("Stage3SATPHandler") as Stage3SATPHandler
).TransferCompleteRequest(responseCommitFinalAssertion);

if (!RequestTransferComplete) {
throw new Error(`Failed to create TransferCompleteRequest`);
}

const responseTransferComplete = await clientSatpStage3.transferComplete(
RequestTransferComplete,
);
this.log.info(
`responseTransferComplete: ${JSON.stringify(responseTransferComplete)}`,
);

this.log.info(`Stage 3 completed`);
}
}
Loading

0 comments on commit 04a09a6

Please sign in to comment.