Implementation of the DIDLedger
contract that supports the SelfKey DID method.
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.
-
createDID(bytes32 _metadata): generates a new DID associated with the caller address as the controller. An "optional"
_metadata
parameter 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
metadata
according 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
id
to a different addressnewController
. -
getController(bytes32 id) returns (address): resolves a DID to its controller address.
Using web3 v1.0, the following illustrates how to interact with the DIDLedger
contract, either
from the truffle console or any client-facing app:
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)
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.
let did
tx.then((result) => { did = result.events.CreatedDID.returnValues.id })
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()
The smart contracts are being implemented in Solidity 0.5.4
.
npm install
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"
}
For local testing, open a new terminal window and run ganache-cli
, then on the project directory:
npm test
or run tests with code coverage:
npm run test:cov
Note: 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 ropsten
We provide the following linting command for inspecting solidity contracts:
npm run lint:sol
Run the following truffle command in order to deploy (e.g. Ropsten testnet)
truffle migrate --network ropsten -f 2
This 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.
Please see the contributing notes.