Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for meta/signed transactions #164

Merged
merged 9 commits into from
Sep 5, 2022

Conversation

lleifermann
Copy link
Contributor

This adds support for the EIP1056 "signed" functions for meta transactions. Enabling users of this dependencies to carry out transactions on behalf of someone else's wallet, as long as the signer of the transaction can prove he has access to the private key material of the current owner of the identity.

We've added tests for each meta transaction case actually resolving the did document afterwards. (Huge kudos to the whole test suite. It really enabled us to understand all of this fast.)

Some open questions we still have:

  • We added a helper function signMetaTxData to sign the data in the correct format for the tests to work. I think this is not normally something this repository really needs thats why we kept it in the dev deps. Is this OK?
  • Added an Interface MetaSignature to keep the signed method variants input parameters clean. Should this be something this package also exports for others to use?

@lleifermann
Copy link
Contributor Author

@mirceanis

Just FYI we are still discussing right now if this repository shouldn't export hashing functions for each of the signed methods. Like hashSetAttributeSigned as this is a very contract specific thing on how this has to be hashed.
(This would move the the ethers dev dep to a normal dep though)

TBH i think the best way would be if the contract actually exposed some functions and you let the hashing (before signing) happen via the contract. But as changing the contract is a rather hard way to pull off we think locating this as close as possible to the contract interaction itself might make sense.

This would also enable us in the future that the contract owns this logic. WDYT?

cc @strumswell @dennisvonderbey

Copy link
Member

@mirceanis mirceanis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wonderful initiative here, thanks for contributing this.

Please see my notes about the dependencies, but especially about the nonce tracking and tell me what you think too.

dataBytes: Uint8Array,
didReg: Contract
) {
const nonce = await didReg.nonce(signerAddress)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method should be tested against the existing deployments because there are differences between the older contract (0xdca7ef03e98e0dc2b855be647c39abe984fcf21b) and the latest one (for example 0x63eD58B671EeD12Bc1652845ba5b2CDfBff198e0) regarding nonce tracking.

See uport-project/ethr-did-registry#12

This issue in particular makes me want to move to a new contract.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So is this about staying compatible to different versions of the contract?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. It's about compatibility.
The older contract, which is deployed to mainnet and ethereum testnets tracks the nonce as a property of the owner, and not as a property of the signer.
Most of the time these are the same address, until the owner of the DID is changed, at which point this becomes an issue.

@mirceanis
Copy link
Member

@mirceanis

Just FYI we are still discussing right now if this repository shouldn't export hashing functions for each of the signed methods. Like hashSetAttributeSigned as this is a very contract specific thing on how this has to be hashed. (This would move the the ethers dev dep to a normal dep though)

TBH i think the best way would be if the contract actually exposed some functions and you let the hashing (before signing) happen via the contract. But as changing the contract is a rather hard way to pull off we think locating this as close as possible to the contract interaction itself might make sense.

This would also enable us in the future that the contract owns this logic. WDYT?

cc @strumswell @dennisvonderbey

This could also be achieved using a wrapper contract that exposes some pure functions for hashing. But I'm not sure I understand what the difference would be between having the contract do the hashing or performing the hashing off-chain.
Is there something else than keccak256 natively available for hashing on EVM ? Or have I misunderstood your ask here?

@lleifermann
Copy link
Contributor Author

@mirceanis
Just FYI we are still discussing right now if this repository shouldn't export hashing functions for each of the signed methods. Like hashSetAttributeSigned as this is a very contract specific thing on how this has to be hashed. (This would move the the ethers dev dep to a normal dep though)
TBH i think the best way would be if the contract actually exposed some functions and you let the hashing (before signing) happen via the contract. But as changing the contract is a rather hard way to pull off we think locating this as close as possible to the contract interaction itself might make sense.
This would also enable us in the future that the contract owns this logic. WDYT?
cc @strumswell @dennisvonderbey

This could also be achieved using a wrapper contract that exposes some pure functions for hashing. But I'm not sure I understand what the difference would be between having the contract do the hashing or performing the hashing off-chain. Is there something else than keccak256 natively available for hashing on EVM ? Or have I misunderstood your ask here?

This is more of a code style and accessibility question than anything else to be honest. Our reasoning was that code which uses this dependency will then have to exactly do the same procedure of hashing as the contract does. Mirroring the code into upstream dependencies.

It's really a question about 'who should own how params are hashed' and having this as close to the contract interaction as possible made sense to us.

The contract has the requirement that hashing happens in some exact way so it's the direct owner of that requirement. Not having to worry about that in this or other dependencies would've been nice.

@mirceanis
Copy link
Member

This is more of a code style and accessibility question than anything else to be honest. Our reasoning was that code which uses this dependency will then have to exactly do the same procedure of hashing as the contract does. Mirroring the code into upstream dependencies.

It's really a question about 'who should own how params are hashed' and having this as close to the contract interaction as possible made sense to us.

I see what you mean.
The way I see this, the "signed" methods require a 2 step process, and both steps could be provided by this library.

Step 1, the DID controller calls some createDoSomethingRequest() method, where they are expected to generate the signature
Step 2, the request + signature is sent to the transaction signer, which calls the actual methods on the contract, or rather a method from EthrDidController (paying the ethereum transaction fee along the way).

Example:

  • DID owner calls createSetAttributeSignerRequest(identity, attrKey, attrValue, rawSigner), which returns an object like:
    { operation: setAttribute, identity: 0x address of the DID, attrKey: <32 byte string>, attrValue: , signature: MetaSignature }
  • controller sends this object to the fee payer
  • fee payer calls setAttributeSigned() on the contract with the above parameters.

Does this make sense? What do you think?

dataBytes: Uint8Array,
didReg: Contract
) {
const nonce = await didReg.nonce(signerAddress)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. It's about compatibility.
The older contract, which is deployed to mainnet and ethereum testnets tracks the nonce as a property of the owner, and not as a property of the signer.
Most of the time these are the same address, until the owner of the DID is changed, at which point this becomes an issue.

@lleifermann
Copy link
Contributor Author

@mirceanis

I've just added changes implementing the things we discussed about. For each meta transaction method we now have a correlating createHash function which generates the correct hash with the needed input parameters.
This means that this library really does not have to deal with the key material at all and it fully stays in the callers hands. We just generate the hash and play it back where it then gets signed (for instance in the kms plugin).

Originally we wanted to put this into some abstraction with only one method but that added a lot of complexity. This approach should be rather straight forward to understand and more importantly debug 😄

Not sure exactly on how to test the nonce function against the older version of the contract though. Do you have an example for this with the ganache setup this repo is running with?

@lleifermann lleifermann requested a review from mirceanis August 18, 2022 12:32
@mirceanis
Copy link
Member

I've just added changes implementing the things we discussed about. For each meta transaction method we now have a correlating createHash function which generates the correct hash with the needed input parameters. This means that this library really does not have to deal with the key material at all and it fully stays in the callers hands. We just generate the hash and play it back where it then gets signed (for instance in the kms plugin).

I love this approach!

Not sure exactly on how to test the nonce function against the older version of the contract though. Do you have an example for this with the ganache setup this repo is running with?

I don't know either, I haven't done anything like this yet so I don't have an example.
The steps to reproduce weird behavior in the old contract:

  • create a DID
  • changeOwner
  • setAttributeSigned (increments nonce for the old owner)
  • setAttributeSigned again << fails with bad_signature if nonce is loaded from signer and not from the owner.

Even worse bug in the old contract:

  • changeOwnerSigned (increments nonce for the old owner, but hash is computed with nonce from the signer)
  • add/removeDelegateSigned (increments nonce for the old owner, but hash is computed with nonce from the signer)
    This means that owner and delegates can be changed at most once using metaTX, until the owner and signer nonces diverge.

Perhaps @piouslove can jump in with an example, or maybe @nichonien has run into this issue at EW

@lleifermann
Copy link
Contributor Author

@mirceanis Now everything should be in-place i believe 😄 - For the tests i had to copy the ABI of the old version of the contract as old packages don't export the abi sadly. But the two new tests shoud cover the compatability of nonces.

Copy link
Member

@mirceanis mirceanis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good.

I think the newer versions of the contract should list a version, so that the user doesn't have to guess if the deployment they are interacting with tracks nonces properly or not. This will also come in handy for further upgrades.
What do you think?

@mirceanis mirceanis merged commit ce93e70 into decentralized-identity:master Sep 5, 2022
uport-automation-bot pushed a commit that referenced this pull request Sep 5, 2022
# [6.2.0](6.1.0...6.2.0) (2022-09-05)

### Features

* add controller support for meta/signed transactions ([#164](#164)) ([ce93e70](ce93e70))
@uport-automation-bot
Copy link
Collaborator

🎉 This PR is included in version 6.2.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Mozartted pushed a commit to coincord/ezrah-did-resolver that referenced this pull request Nov 14, 2024
# 1.0.0 (2024-11-14)

### Bug Fixes

* add esm wrapper instead of double transpile ([d2bbeaf](d2bbeaf))
* broaden window for event logs processing (fix Aurora) ([decentralized-identity#149](https://github.com/coincord/ezrah-did-resolver/issues/149)) ([5ee6bed](5ee6bed))
* **build:** add named exports to esm wrapper ([decentralized-identity#176](https://github.com/coincord/ezrah-did-resolver/issues/176)) ([725ed25](725ed25)), closes [decentralized-identity#175](https://github.com/coincord/ezrah-did-resolver/issues/175)
* **build:** build commonjs and also expose esm wrapper ([522c199](522c199))
* **build:** include default export to work around some bundler issues ([decentralized-identity#205](https://github.com/coincord/ezrah-did-resolver/issues/205)) ([1e9e4ef](1e9e4ef)), closes [decentralized-identity#186](https://github.com/coincord/ezrah-did-resolver/issues/186)
* **build:** transpile for commonjs, use wrapper for esm ([decentralized-identity#170](https://github.com/coincord/ezrah-did-resolver/issues/170)) ([5eba679](5eba679))
* **build:** use commonjs module in tsconfig ([e66d054](e66d054))
* change 'owner' to 'controller' to follow W3C Spec ([decentralized-identity#75](https://github.com/coincord/ezrah-did-resolver/issues/75)) ([decentralized-identity#81](https://github.com/coincord/ezrah-did-resolver/issues/81)) ([af37b3f](af37b3f))
* **ci:** groom the build scripts and dependencies ([decentralized-identity#156](https://github.com/coincord/ezrah-did-resolver/issues/156)) ([9a53958](9a53958))
* **ci:** run tests on a matrix of node versions ([3825ac0](3825ac0))
* consistent Encoding of `attrValue` on `createRevokeAttributeHash` ([decentralized-identity#200](https://github.com/coincord/ezrah-did-resolver/issues/200)) ([81363d0](81363d0))
* create alpha release ([1d5d5f2](1d5d5f2))
* **deps:** bump dependencies and adapt code ([decentralized-identity#193](https://github.com/coincord/ezrah-did-resolver/issues/193)) ([0a8da00](0a8da00))
* **deps:** bump did-resolver to 3.1.3+ ([0ddde4b](0ddde4b))
* **deps:** bump ethers to ^5.5.0 ([c39788a](c39788a))
* **deps:** remove querystring in favor of UrlSearchParams ([cd5e596](cd5e596))
* **deps:** update all non-major dependencies ([5d1be47](5d1be47))
* **deps:** update dependency buffer to v6 ([decentralized-identity#93](https://github.com/coincord/ezrah-did-resolver/issues/93)) ([e1dc861](e1dc861))
* **deps:** update dependency did-resolver to v1.1.0 ([ab47058](ab47058))
* **deps:** update dependency did-resolver to v2 ([decentralized-identity#68](https://github.com/coincord/ezrah-did-resolver/issues/68)) ([831ec17](831ec17))
* **deps:** update dependency did-resolver to v2.1.0 ([b26d387](b26d387))
* **deps:** update dependency did-resolver to v2.1.1 ([1a4cbca](1a4cbca))
* **deps:** update dependency did-resolver to v2.1.2 ([8c2294e](8c2294e))
* **deps:** Update dependency did-resolver to v4.1.0 ([ea501e1](ea501e1))
* **deps:** update dependency ethers to v6.10.0 ([435ae92](435ae92))
* **deps:** update dependency ethers to v6.11.0 ([35620c9](35620c9))
* **deps:** update dependency ethers to v6.11.1 ([d22fd46](d22fd46))
* **deps:** update dependency ethers to v6.13.0 ([9c9d978](9c9d978))
* **deps:** update dependency ethers to v6.13.1 ([e6885b9](e6885b9))
* **deps:** update dependency ethers to v6.13.2 ([c9d253f](c9d253f))
* **deps:** update dependency ethers to v6.13.3 ([840f6d4](840f6d4))
* **deps:** update dependency ethers to v6.13.4 ([f940b8e](f940b8e))
* **deps:** update dependency ethers to v6.9.0 ([0ca70ec](0ca70ec))
* **deps:** update dependency ethers to v6.9.1 ([01e0006](01e0006))
* **deps:** update dependency ethers to v6.9.2 ([0e69c5b](0e69c5b))
* **deps:** update dependency ethjs-contract to ^0.2.0 ([b667ce6](b667ce6))
* **deps:** update did-resolver to 4.0.1 ([decentralized-identity#172](https://github.com/coincord/ezrah-did-resolver/issues/172)) ([ce38d01](ce38d01))
* **deps:** update ethers to v6 ([decentralized-identity#188](https://github.com/coincord/ezrah-did-resolver/issues/188)) ([2785e61](2785e61))
* **deps:** use Resolvable type from did-resolver ([d213ae6](d213ae6))
* **doc:** update LD [@context](https://github.com/context) ([decentralized-identity#154](https://github.com/coincord/ezrah-did-resolver/issues/154)) ([29c196a](29c196a)), closes [decentralized-identity#151](https://github.com/coincord/ezrah-did-resolver/issues/151)
* **doc:** update spec to use new CAIP10 format ([77a4f67](77a4f67))
* e2e tests with deprecated ethr test networks ([0fd9915](0fd9915))
* export MetaSignature type ([62f250a](62f250a))
* hex values getting wrongly encoded to utf8 for setAttributeSigned ([c5c8989](c5c8989))
* ignore query string when interpreting identifiers ([decentralized-identity#123](https://github.com/coincord/ezrah-did-resolver/issues/123)) ([5508f8a](5508f8a)), closes [decentralized-identity#122](https://github.com/coincord/ezrah-did-resolver/issues/122)
* maintenance of dependencies, bots and build scripts ([decentralized-identity#136](https://github.com/coincord/ezrah-did-resolver/issues/136)) ([0d3fcf7](0d3fcf7))
* reference /enc/ keys in `keyAgreement` section of DID doc ([decentralized-identity#146](https://github.com/coincord/ezrah-did-resolver/issues/146)) ([5d507ef](5d507ef)), closes [decentralized-identity#145](https://github.com/coincord/ezrah-did-resolver/issues/145)
* remove 0x prefix from publicKeyHex ([decentralized-identity#147](https://github.com/coincord/ezrah-did-resolver/issues/147)) ([063ee67](063ee67)), closes [decentralized-identity#140](https://github.com/coincord/ezrah-did-resolver/issues/140)
* remove ejs module distribution ([780ec08](780ec08)), closes [decentralized-identity#39](https://github.com/coincord/ezrah-did-resolver/issues/39)
* require a configuration to be used when initializing the resolver ([3adc029](3adc029))
* reverse events to have consistent order ([decentralized-identity#87](https://github.com/coincord/ezrah-did-resolver/issues/87)) ([08b9692](08b9692)), closes [/github.com/decentralized-identity/issues/86#issuecomment-699961595](https://github.com//github.com/decentralized-identity/ethr-did-resolver/issues/86/issues/issuecomment-699961595)
* revert aurora tweaks and use known deployments in config ([decentralized-identity#161](https://github.com/coincord/ezrah-did-resolver/issues/161)) ([e238a9f](e238a9f))
* **spec:** remove ambiguity around deletion ([decentralized-identity#178](https://github.com/coincord/ezrah-did-resolver/issues/178)) ([da8e22e](da8e22e)), closes [decentralized-identity#177](https://github.com/coincord/ezrah-did-resolver/issues/177)
* strip milliseconds from dateTime strings ([decentralized-identity#129](https://github.com/coincord/ezrah-did-resolver/issues/129)) ([3e958af](3e958af)), closes [decentralized-identity#126](https://github.com/coincord/ezrah-did-resolver/issues/126)
* **test:** remove the connection test for goerli network ([decentralized-identity#201](https://github.com/coincord/ezrah-did-resolver/issues/201)) ([c861026](c861026))
* track legacy deployments, fix nonce calculation, export contract ([decentralized-identity#167](https://github.com/coincord/ezrah-did-resolver/issues/167)) ([c0d0366](c0d0366)), closes [decentralized-identity#165](https://github.com/coincord/ezrah-did-resolver/issues/165) [decentralized-identity#166](https://github.com/coincord/ezrah-did-resolver/issues/166)
* **types:** simplify type exports ([decentralized-identity#101](https://github.com/coincord/ezrah-did-resolver/issues/101)) ([90ca9b5](90ca9b5))
* update blockchainAccountId to the new CAIP10 format ([decentralized-identity#153](https://github.com/coincord/ezrah-did-resolver/issues/153)) ([9c3f401](9c3f401)), closes [decentralized-identity#152](https://github.com/coincord/ezrah-did-resolver/issues/152)
* **updates:** package.json changes for base versioning ([b5bfa4a](b5bfa4a))
* use rpcUrl in controller config ([decentralized-identity#128](https://github.com/coincord/ezrah-did-resolver/issues/128)) ([5302536](5302536)), closes [decentralized-identity#127](https://github.com/coincord/ezrah-did-resolver/issues/127)

### Features

* add `assertionMethod` by default to didDocument ([decentralized-identity#124](https://github.com/coincord/ezrah-did-resolver/issues/124)) ([11b2096](11b2096)), closes [decentralized-identity#117](https://github.com/coincord/ezrah-did-resolver/issues/117) [decentralized-identity#115](https://github.com/coincord/ezrah-did-resolver/issues/115)
* add ability to use a compressed publicKey as identifier ([decentralized-identity#73](https://github.com/coincord/ezrah-did-resolver/issues/73)) ([e257eb3](e257eb3)), closes [decentralized-identity#56](https://github.com/coincord/ezrah-did-resolver/issues/56)
* add controller support for meta/signed transactions ([decentralized-identity#164](https://github.com/coincord/ezrah-did-resolver/issues/164)) ([ce93e70](ce93e70))
* add encryption key support for ethr-did-documents ([dff7b0f](dff7b0f)), closes [decentralized-identity#52](https://github.com/coincord/ezrah-did-resolver/issues/52)
* add encryption key support for ethr-did-documents ([2f5825c](2f5825c)), closes [decentralized-identity#52](https://github.com/coincord/ezrah-did-resolver/issues/52)
* add experimental support for ServiceEndpoint objects ([decentralized-identity#163](https://github.com/coincord/ezrah-did-resolver/issues/163)) ([3919a25](3919a25))
* add JSON-LD contexts that define all the terms being used ([decentralized-identity#192](https://github.com/coincord/ezrah-did-resolver/issues/192)) ([cd49ab8](cd49ab8))
* add linea:goerli deployment ([b7a36b3](b7a36b3))
* add Sepolia deployment ([decentralized-identity#195](https://github.com/coincord/ezrah-did-resolver/issues/195)) ([94015bf](94015bf))
* Add types declaration stubb ([05944b1](05944b1))
* **deployment:** add gnosischain and holesky deployments ([decentralized-identity#206](https://github.com/coincord/ezrah-did-resolver/issues/206)) ([4992094](4992094))
* export `EthrDidController` helper class ([decentralized-identity#120](https://github.com/coincord/ezrah-did-resolver/issues/120)) ([745100d](745100d))
* import instead of require networks.json ([50c0832](50c0832))
* track signing keys independently ([decentralized-identity#194](https://github.com/coincord/ezrah-did-resolver/issues/194)) ([cc44100](cc44100)), closes [decentralized-identity#184](https://github.com/coincord/ezrah-did-resolver/issues/184)
* upgrade to latest did core spec ([decentralized-identity#99](https://github.com/coincord/ezrah-did-resolver/issues/99)) ([decentralized-identity#109](https://github.com/coincord/ezrah-did-resolver/issues/109)) ([d46eea3](d46eea3)), closes [decentralized-identity#105](https://github.com/coincord/ezrah-did-resolver/issues/105) [decentralized-identity#95](https://github.com/coincord/ezrah-did-resolver/issues/95) [decentralized-identity#106](https://github.com/coincord/ezrah-did-resolver/issues/106) [decentralized-identity#83](https://github.com/coincord/ezrah-did-resolver/issues/83) [decentralized-identity#85](https://github.com/coincord/ezrah-did-resolver/issues/85) [decentralized-identity#83](https://github.com/coincord/ezrah-did-resolver/issues/83) [decentralized-identity#85](https://github.com/coincord/ezrah-did-resolver/issues/85) [decentralized-identity#95](https://github.com/coincord/ezrah-did-resolver/issues/95) [decentralized-identity#105](https://github.com/coincord/ezrah-did-resolver/issues/105) [decentralized-identity#106](https://github.com/coincord/ezrah-did-resolver/issues/106)
* upgrade to latest did core spec ([decentralized-identity#99](https://github.com/coincord/ezrah-did-resolver/issues/99)) ([decentralized-identity#109](https://github.com/coincord/ezrah-did-resolver/issues/109)) ([decentralized-identity#111](https://github.com/coincord/ezrah-did-resolver/issues/111)) ([2a023b1](2a023b1)), closes [decentralized-identity#105](https://github.com/coincord/ezrah-did-resolver/issues/105) [decentralized-identity#95](https://github.com/coincord/ezrah-did-resolver/issues/95) [decentralized-identity#106](https://github.com/coincord/ezrah-did-resolver/issues/106) [decentralized-identity#83](https://github.com/coincord/ezrah-did-resolver/issues/83) [decentralized-identity#85](https://github.com/coincord/ezrah-did-resolver/issues/85) [decentralized-identity#83](https://github.com/coincord/ezrah-did-resolver/issues/83) [decentralized-identity#85](https://github.com/coincord/ezrah-did-resolver/issues/85) [decentralized-identity#95](https://github.com/coincord/ezrah-did-resolver/issues/95) [decentralized-identity#105](https://github.com/coincord/ezrah-did-resolver/issues/105) [decentralized-identity#106](https://github.com/coincord/ezrah-did-resolver/issues/106)
* use only named exports ([decentralized-identity#31](https://github.com/coincord/ezrah-did-resolver/issues/31)) ([a558e14](a558e14))
* versioning ([decentralized-identity#121](https://github.com/coincord/ezrah-did-resolver/issues/121)) ([b794d69](b794d69)), closes [decentralized-identity#119](https://github.com/coincord/ezrah-did-resolver/issues/119) [decentralized-identity#118](https://github.com/coincord/ezrah-did-resolver/issues/118) [decentralized-identity#119](https://github.com/coincord/ezrah-did-resolver/issues/119) [decentralized-identity#118](https://github.com/coincord/ezrah-did-resolver/issues/118)

### BREAKING CHANGES

* the keys in the `verificationMethod` array are no longer all referenced in the `assertionMethod` array. Only authentication (`sigAuth`) or signing keys (`veriKey`) are added.
* **deps:** this update uses ethers v6 which has a sufficiently different API from v5 that will likely need attention. While the API of this library hasn't changed, it is likely that an update will need attention so this is marked as a breaking change and a new major version is released.
* **spec:** This is a breaking change of the spec as "soft deletion" of non-updated DIDs is no longer considered valid.
* **build:** previous versions (<7.0.0) would be transpiled twice by microbundle, but this seems to be [anti-pattern](https://redfin.engineering/node-modules-at-war-why-commonjs-and-es-modules-cant-get-along-9617135eeca1)

Please raise an issue on https://github.com/decentralized-identity/ethr-did-resolver if this change is incompatible with your tech stack and there are no workarounds.
* ESM is only supported through a wrapper
* **doc:** Since the context definitions most often have to be embedded in apps, this requires apps to download the new definition.
* Apps have to update their processing of `blockchainAccountId` to use the [new CAIP10 format](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-10.md)
* `publicKeyHex` values in the DID document no longer contain a `0x` prefix
* The return type is `DIDResolutionResult` which wraps a `DIDDocument`.
* No errors are thrown during DID resolution. Please check `result.didResolutionMetadata.error` instead.
* This DID core spec requirement will break for users expecting `publicKey`, `ethereumAddress`, `Secp256k1VerificationKey2018` entries in the DID document. They are replaced with `verificationMethod`, `blockchainAccountId` and `EcdsaSecp256k1VerificationKey2019` and `EcdsaSecp256k1RecoveryMethod2020` depending on the content.
* JWTs that refer to the `did:ethr:...#owner` key in their header may be considered invalid after this upgrade, as the key id is now `did:ethr:...#controller`
* this removes the fallback hardcoded RPC URLs and will fail early when a wrong configuration (or none) is provided to `getResolver()`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants