Implement org.trustweave.did.DidMethod with type-safe Did, VerificationMethod, VerificationMethodId, and sealed DidResolutionResult. For createDid, follow org.trustweave.testkit.did.DidKeyMockMethod (KMS GenerateKeyResult, document layout).
Deactivation: per DID Resolution 1.0
§4.4, resolveDid must return DidResolutionResult.Deactivated — never Success — for a
deactivated DID; there is no document in that case, even if your backend still has one on file.
All first-party TrustWeave DID method plugins build this via the shared
DidMethodUtils.createSuccessResolutionResult(document, method, deactivated = …) factory in
did:plugins:base, which picks Success or Deactivated for you — prefer that over
constructing DidResolutionResult directly if your method has access to it.
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)returnwhen{document==null->DidResolutionResult.Failure.NotFound(did=did)isDeactivatedInBackend(did)->// DID Resolution 1.0 §4.4: a deactivated DID returns NO document, ever —// do not wrap it in Success even though you still have the document data.DidResolutionResult.Deactivated(did=did)else->DidResolutionResult.Success(document=document,resolutionMetadata=DidResolutionMetadata(contentType="application/did+json"))}}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){/* … */}privatefunisDeactivatedInBackend(did:Did):Boolean=false// your storeprivatefundeactivateInBackend(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