importorg.trustweave.did.DidMethodimportorg.trustweave.did.DidCreationOptionsimportorg.trustweave.did.identifiers.Didimportorg.trustweave.did.model.DidDocumentimportorg.trustweave.did.resolver.DidResolutionMetadataimportorg.trustweave.did.resolver.DidResolutionResultimportorg.trustweave.kms.KeyManagementServiceclassMyCustomDidMethod(privatevalkms:KeyManagementService,privatevalconfig:MyDidConfig):DidMethod{overridevalmethod:String="mydid"overridesuspendfuncreateDid(options:DidCreationOptions):DidDocument{TODO("See DidKeyMockMethod in testkit for a working createDid implementation")}overridesuspendfunresolveDid(did:Did):DidResolutionResult{valdocument=resolveFromBackend(did)returnif(document!=null){DidResolutionResult.Success(document=document,resolutionMetadata=DidResolutionMetadata(contentType="application/did+json"))}else{DidResolutionResult.Failure.NotFound(did=did)}}overridesuspendfunupdateDid(did:Did,updater:(DidDocument)->DidDocument):DidDocument{valcurrent=when(valr=resolveDid(did)){isDidResolutionResult.Success->r.documentelse->error("DID not found: ${did.value}")}valupdated=updater(current)persistToBackend(did,updated)returnupdated}overridesuspendfundeactivateDid(did:Did):Boolean=deactivateInBackend(did)privatefunresolveFromBackend(did:Did):DidDocument?=null// your storeprivatefunpersistToBackend(did:Did,document:DidDocument){/* … */}privatefundeactivateInBackend(did:Did):Boolean=false}
importorg.trustweave.did.spi.DidMethodProviderimportorg.trustweave.did.*importorg.trustweave.kms.KeyManagementServiceclassMyDidMethodProvider:DidMethodProvider{overridevalname:String="my-did-method"overridevalsupportedMethods:List<String>=listOf("mydid")overridefuncreate(methodName:String,options:DidCreationOptions):DidMethod?{if(methodName!="mydid")returnnull// Create KMSvalkms=createKms(options)// Create config from optionsvalconfig=MyDidConfig.fromOptions(options)returnMyCustomDidMethod(kms,config)}privatefuncreateKms(options:DidCreationOptions):KeyManagementService{// Create or get KMS instanceTODO("provide KMS implementation")}}
Registering Provider
Create service file at src/main/resources/META-INF/services/org.trustweave.did.spi.DidMethodProvider:
importorg.trustweave.anchor.*importkotlinx.serialization.json.JsonElementclassMyBlockchainAnchorClient(valchainId:String,privatevalconfig:MyBlockchainConfig):BlockchainAnchorClient{overridesuspendfunwritePayload(payload:JsonElement,mediaType:String):AnchorResult{// Submit transaction to blockchainvaltxHash=submitTransaction(payload)// Wait for confirmationvalblockHeight=waitForConfirmation(txHash)returnAnchorResult(ref=AnchorRef(chainId=chainId,txHash=txHash,extra=mapOf("blockHeight"toblockHeight.toString(),"timestamp"toSystem.currentTimeMillis().toString())),payload=payload,mediaType=mediaType)}overridesuspendfunreadPayload(ref:AnchorRef):AnchorResult{// Read transaction from blockchainvalpayload=readTransaction(ref.txHash)?:throwIllegalStateException("Anchor not found: ${ref.txHash}")returnAnchorResult(ref=ref,payload=payload)}privatefunsubmitTransaction(payload:JsonElement):String{TODO("submit transaction to your chain")}privatefunwaitForConfirmation(txHash:String):Long{TODO("await N confirmations")}privatefunreadTransaction(txHash:String):JsonElement?{TODO("read payload from your chain")}}
importorg.trustweave.core.plugin.PluginLifecycleclassMyLifecycleAwareAnchorClient(valchainId:String,privatevalconfig:MyBlockchainConfig):BlockchainAnchorClient,PluginLifecycle{overridesuspendfuninitialize(config:Map<String,Any?>):Boolean{// Initialize connectionsreturntrue}overridesuspendfunstart():Boolean{// Start background processesreturntrue}overridesuspendfunstop():Boolean{// Stop background processesreturntrue}overridesuspendfuncleanup(){// Clean up resources (return type is Unit, do not throw)}// ... implement BlockchainAnchorClient methods ...}
Next Steps
Review Creating Plugins for detailed plugin implementation guide