This document mainly introduces how to use go-did to interact with Memo DID and Mfile DID contracts. For more information about DID, please refer to the DID document, for more information about Memo DID, please refer to the Memo DID document, for more information about Mfile DID, please refer to the Mfile DID document.
git clone https://github.com/memoio/js-did.git
In go-did, the MemoDIDController class is provided to control the Memo DID document saved in the contract, thereby realizing the control of Memo DID permissions. Currently the following chains are supported:
Create a new DID.
import { MemoDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
// get signer from sk
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet)
// get signer from metamask
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer)
const publicKeyHex = '0x03d21e6c4843fa3f5d019e551131106e2075925b01da2a83dc177879a512eb608f'
const tx = await controller.registe(publicKeyHex)
console.log(tx)If the DID has been created, you can view the complete DID document.
import { MemoDIDReslover } from 'js-did'
const resolver = new MemoDIDReslover('dev')
const document = resolver.resolve('did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96')
console.log(document)Existing authentication methods can be modified.
import { MemoDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const publicKeyHex = '0x02d78b20654eb7a5d58d83b25d090a338eff18f0b5f919777c9d894c2e161b4b52'
const tx = await controller.updateVerificationMethod(`${did}#key-1`, 'EcdsaSecp256k1VerificationKey2019', publicKeyHex)
console.log(tx)You can delete existing authentication methods.
import { MemoDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.deactivateVerificationMethod(`${did}#key-1`)
console.log(tx)After creating a Memo DID, you can add a new login verification method, which includes public key information, etc. After successfully adding, you can use the signature of the corresponding private key to log in to a third-party application offline as the DID, such as the memo middleware.
import { MemoDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.addRelationShip(RelationType.Authentication, `${did}#masterKey`)
console.log(tx)You can delete an existing login method. After the deletion is successful, you will not be able to log in to third-party applications offline with the DID using the signature of the corresponding private key.
import { MemoDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.deactivateRelationShip(RelationType.Authentication, `${did}#masterKey`)
console.log(tx)After creating a Memo DID, you can add a new proxy access verification method, which includes public key information, etc. After successfully adding, you can use the signature of the corresponding private key to access resources that require permissions as the DID, such as the user's private files in the Memo middleware.
import { MemoDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.addRelationShip(RelationType.CapabilityDelegation, `${did}#masterKey`, 2 * 60)
console.log(tx)The original proxy access verification method can be deleted. After the deletion is successful, the corresponding private key signature will be used to sign the DID and the resources that require permission will not be accessible.
import { MemoDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.deactivateRelationShip(RelationType.CapabilityDelegation, `${did}#masterKey`)
console.log(tx)You can purchase the read permission of private files by paying. After purchasing the read permission, memo did will be added to the read field of mfile did, so that you can request the file corresponding to mfile did offline. Before purchasing the read permission, you need to call the approve method.
import { MemoDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.approveOfMfileContract(100)
console.log(tx)
const tx = await controller.buyReadPermission('did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4')
console.log(tx)Delete the created DID. Once deleted, the DID will be unavailable and cannot be recreated.
import { MemoDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MemoDID(signer, did)
const tx = await controller.deactivateDID()
console.log(tx)In go-did, the MfileDIDController class is provided to control the Mfile DID document saved in the contract, thereby realizing the control of Mfile DID permissions. Currently the following chains are supported:
Create a new Mfile DID.
import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.registe('mid', 0, 50, ['js', 'test'], 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96')
console.log(tx)If the DID has been created, you can view the complete DID document.
import { MfileDIDResolver } from 'js-did'
const resolver = new MfileDIDResolver('dev')
const document = await resolver.resolve('did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4')
console.log(document)The owner of Mfile DID can transfer the Mfile DID by changing the owner.
import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.changeController('did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96')
console.log(tx)The files corresponding to Mfile DID include public files and private files. You can modify the file type through this method. 0 represents private files and 1 represents public files.
import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.changeFileType(1)
console.log(tx)import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.changePrice(40)
console.log(tx)The keywords of the file are used to search for the file. You can change the keywords of the file as needed.
import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.changeKeywords(['movie', 'china'])
console.log(tx)When the file displayed by the Mfile DID is a private file, other Memo DID owners can directly grant read permissions in addition to purchasing read permissions.
import { MfileDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.addRelationShip(RelationType.Read, 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96')
console.log(tx)You can revoke previously granted read permissions, but you cannot revoke read permissions purchased by others.
import { MfileDID, getProvider, RelationType } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.deactivateRelationShip(RelationType.Read, 'did:memo:d687daa192ffa26373395872191e8502cc41fbfbf27dc07d3da3a35de57c2d96')
console.log(tx)Delete Mfile DID.
import { MfileDID, getProvider } from 'js-did'
import { ethers } from 'ethers'
const did = 'did:mfile:bafkreic7emp2v6ofwkpiiqmrbjq2m6sgyws4eyq5jbphqiywkqyxzbags4'
const provider = getProvider('dev')
const wallet = new ethers.Wallet(privateKey, provider)
let controller = new MemoDID(wallet, did)
const web3Provider = new ethers.BrowserProvider(window.ethereum)
const signer = web3Provider.getSigner()
controller = new MfileDID(signer, did)
const tx = await controller.deactivateDID()
console.log(tx)