selfkey-did-ledger v1.0.1
selfkey-identity
Implementation of the DIDLedger contract that supports the SelfKey DID method.
Overview
The DIDLedger contract works as a public DID ledger for decentralized identifiers as
specified in the SelfKey DID method specs document. Any Ethereum account can generate a DID and manage it through the provided public method interface.
Method interface
createDID(bytes32 _metadata): generates a new DID associated with the caller address as the controller. An "optional"
_metadataparameter is allowed to be used as information for any resolvers dealing with this method. By default, it's assumed that a 32-byte array with value of zero means that the controller address is a regular Ethereum account.setMetadata(bytes32 id, bytes32 _metadata): a DID controller can change the
metadataaccording to the specific needs of a particular protocol or for personal reasons. The purpose of this field is not strictly defined by the ledger. However, under the SelfKey DID method, a DID resolver must interpret the metadata value as the type of identity in order to resolve it accordingly. For example: if the controller address is an instance of a smart contract (e.g. ERC725), the value to be used as metadata would bekeccak256('ERC725'). Other protocols or applications might choose to use this attribute in a different manner.deleteDID(bytes32 id): callable by the controller address. Deletes the DID from the ledger.
setController(bytes32 id, address newController): DID controller address can transfer control of the DID specified as
idto a different addressnewController.getController(bytes32 id) returns (address): resolves a DID to its controller address.
Example web3 code
Using web3 v1.0, the following illustrates how to interact with the DIDLedger contract, either
from the truffle console or any client-facing app:
Loading the contract
const fs = require('fs')
const ledgerAddress = '0x24512422CF6AD1c0C465cBF0Bbd5155EaA3DA634'
const ledgerABI = JSON.parse(fs.readFileSync('./build/contracts/DIDLedger.json')).abi
const ledger = new web3.eth.Contract(ledgerABI, ledgerAddress)Creating a DID
const zero = web3.utils.hexToBytes('0x0000000000000000000000000000000000000000000000000000000000000000')
let tx = ledger.methods.createDID(zero).send({ 'from': '0xaf04420C45fc6a063c531C13D9850e4Aa5d951b4' })If making these tests using the truffle console, the from address should be set to that being
loaded from the wallet.json mnemonic key.
Retrieving the DID from the transaction data
let did
tx.then((result) => { did = result.events.CreatedDID.returnValues.id })Resolving a DID to its controller address
ledger.methods.getController(did).call()If desired to get more info about a DID (e.g. metadata, creation and update datetimes), the dids
mapping should be accessed directly as follows:
ledger.methods.dids(did).call()Development
The smart contracts are being implemented in Solidity 0.5.4.
Pre-requisites
Initialization
npm installSetting up a wallet
Truffle configuration file (truffle-config.js) assumes there should be a file local/wallet.json
with a list of BIP32 mnemonic words encoding a wallet's private key.
(local directory already added to .gitignore to prevent accidental pushing of private keys to
github).
An example wallet.json file should look like this:
{
"mnemonic":
"swear tourist road ready scout venture elephant quick pull dress stock trick"
}Testing
For local testing, open a new terminal window and run ganache-cli, then on the project directory:
npm testor run tests with code coverage:
npm run test:covNote: any running instance of ganache-cli will need to be closed for running the tests with
coverage since solidity-coverage runs its own local environment.
To interact with contracts deployed on Ethereum (e.g. Ropsten testnet), open truffle console:
truffle console --network ropstenLinting
We provide the following linting command for inspecting solidity contracts:
npm run lint:solDeploying
Run the following truffle command in order to deploy (e.g. Ropsten testnet)
truffle migrate --network ropsten -f 2This will run the second migration file, which deploys the DID ledger to the specified network.
Parameters for connecting to each network are specified in the truffle-config.js file.
For info on other Truffle commands, see truffleframework.com.
Contributing
Please see the contributing notes.