1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00

Merge pull request #394 from oceanprotocol/feature/transferOwnership

Feature/transfer ownership
This commit is contained in:
Matthias Kretschmann 2020-04-02 14:23:58 +02:00 committed by GitHub
commit 130c9d7938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 120 additions and 10 deletions

View File

@ -23,7 +23,7 @@ before_script:
- ganache-cli --port 18545 > ganache-cli.log & - ganache-cli --port 18545 > ganache-cli.log &
- git clone https://github.com/oceanprotocol/barge - git clone https://github.com/oceanprotocol/barge
- cd barge - cd barge
- export AQUARIUS_VERSION=v1.0.7 - export AQUARIUS_VERSION=unstable
- export BRIZO_VERSION=v0.9.3 - export BRIZO_VERSION=v0.9.3
- export KEEPER_VERSION=v0.13.2 - export KEEPER_VERSION=v0.13.2
- export EVENTS_HANDLER_VERSION=v0.4.5 - export EVENTS_HANDLER_VERSION=v0.4.5

View File

@ -215,6 +215,51 @@ export class Aquarius {
return this.retrieveDDO(undefined, metadataServiceEndpoint) return this.retrieveDDO(undefined, metadataServiceEndpoint)
} }
/**
* Transfer ownership of a DDO
* @param {DID | string} did DID of the asset to update.
* @param {String} newOwner New owner of the DDO
* @param {String} updated Updated field of the DDO
* @param {String} signature Signature using updated field to verify that the consumer has rights
* @return {Promise<String>} Result.
*/
public async transferOwnership(
did: DID | string,
newOwner: string,
updated: string,
signature: string
): Promise<string> {
did = did && DID.parse(did)
const fullUrl = `${this.url}${apiPath}/owner/update/${did.getDid()}`
const result = await this.fetch
.put(
fullUrl,
JSON.stringify({
signature: signature,
updated: updated,
newOwner: newOwner
})
)
.then((response: any) => {
if (response.ok) {
return response.text
}
this.logger.log(
'transferownership failed:',
response.status,
response.statusText
)
return null
})
.catch(error => {
this.logger.error('Error transfering ownership metadata: ', error)
return null
})
return result
}
public getServiceEndpoint(did: DID) { public getServiceEndpoint(did: DID) {
return `${this.url}/api/v1/aquarius/assets/ddo/did:op:${did.getId()}` return `${this.url}/api/v1/aquarius/assets/ddo/did:op:${did.getId()}`
} }

View File

@ -40,6 +40,8 @@ export class DDO {
public created: string public created: string
public updated: string
public publicKey: PublicKey[] = [] public publicKey: PublicKey[] = []
public authentication: Authentication[] = [] public authentication: Authentication[] = []

View File

@ -311,6 +311,16 @@ export class OceanAssets extends Instantiable {
* @return {Promise<string>} Returns Account ID * @return {Promise<string>} Returns Account ID
*/ */
public async owner(did: string): Promise<string> { public async owner(did: string): Promise<string> {
const owner = await this.ocean.keeper.didRegistry.getDIDOwner(did)
return owner
}
/**
* Returns the creator of a asset.
* @param {string} did Decentralized ID.
* @return {Promise<string>} Returns eth address
*/
public async creator(did: string): Promise<string> {
const ddo = await this.resolve(did) const ddo = await this.resolve(did)
const checksum = ddo.getChecksum() const checksum = ddo.getChecksum()
const { creator, signatureValue } = ddo.proof const { creator, signatureValue } = ddo.proof
@ -341,14 +351,37 @@ export class OceanAssets extends Instantiable {
* Transfer ownership of an asset. * Transfer ownership of an asset.
* @param {string} did Asset DID. * @param {string} did Asset DID.
* @param {string} newOwner Ethereum address of the new owner of the DID. * @param {string} newOwner Ethereum address of the new owner of the DID.
* @param {Account} account Ethereum account of original/old owner to sign and prove the ownership.
* @return {Promise<TransactionReceipt>} Returns Web3 transaction receipt. * @return {Promise<TransactionReceipt>} Returns Web3 transaction receipt.
*/ */
public async transferOwnership( public async transferOwnership(
did: string, did: string,
newOwner: string newOwner: string,
account: Account
): Promise<TransactionReceipt> { ): Promise<TransactionReceipt> {
const owner = await this.ocean.assets.owner(did) const oldOwner = await this.ocean.assets.owner(did)
return this.ocean.keeper.didRegistry.transferDIDOwnership(did, newOwner, owner) const oldDdo = await this.ocean.aquarius.retrieveDDO(did)
// update owner on-chain
const txReceipt = this.ocean.keeper.didRegistry.transferDIDOwnership(
did,
newOwner,
oldOwner
)
// get a signature
const signature = await this.ocean.utils.signature.signForAquarius(
oldDdo.updated,
account
)
if (signature != null)
await this.ocean.aquarius.transferOwnership(
did,
newOwner,
oldDdo.updated,
signature
)
return txReceipt
} }
/** /**

View File

@ -1,5 +1,6 @@
import Web3 from 'web3' import Web3 from 'web3'
import { Logger } from '../../utils' import { Logger } from '../../utils'
import { Account } from '../../squid'
export class SignatureUtils { export class SignatureUtils {
private web3: Web3 private web3: Web3
@ -40,4 +41,35 @@ export class SignatureUtils {
public async verifyText(text: string, signature: string): Promise<string> { public async verifyText(text: string, signature: string): Promise<string> {
return this.web3.eth.personal.ecRecover(text, signature) return this.web3.eth.personal.ecRecover(text, signature)
} }
public async getHash(message: string): Promise<string> {
let hex = ''
for (let i = 0; i < message.length; i++) {
hex += '' + message.charCodeAt(i).toString(16)
}
const hexMessage = '0x' + hex
return hexMessage as string
}
public async signForAquarius(message: string, account: Account): Promise<string> {
const hash = await this.getHash(message)
const isMetaMask =
this.web3 &&
this.web3.currentProvider &&
(this.web3.currentProvider as any).isMetaMask
try {
return this.web3.eth.personal.sign(
hash,
account.getId(),
account.getPassword()
)
} catch (e) {
if (isMetaMask) {
throw e
}
this.logger.warn('Error on personal sign.')
this.logger.warn(e)
return null
}
}
} }

View File

@ -81,7 +81,6 @@ describe('Asset Owners', () => {
) )
const ddo = await ocean.assets.create(metadata as any, account1) const ddo = await ocean.assets.create(metadata as any, account1)
const { length: finalLength1 } = await ocean.assets.consumerAssets( const { length: finalLength1 } = await ocean.assets.consumerAssets(
account2.getId() account2.getId()
) )
@ -98,10 +97,8 @@ describe('Asset Owners', () => {
) )
) )
} catch {} } catch {}
await ocean.assets.order(ddo.id, account2) await ocean.assets.order(ddo.id, account2)
// Access granted // Access granted
const { length: finalLength2 } = await ocean.assets.consumerAssets( const { length: finalLength2 } = await ocean.assets.consumerAssets(
account2.getId() account2.getId()
) )
@ -110,12 +107,13 @@ describe('Asset Owners', () => {
it('should be able to transfer ownership', async () => { it('should be able to transfer ownership', async () => {
const { id } = await ocean.assets.create(metadata as any, account1) const { id } = await ocean.assets.create(metadata as any, account1)
// transfer // transfer
await ocean.assets.transferOwnership(id, account2.getId()) await ocean.assets.transferOwnership(id, account2.getId(), account1)
const newOwner = await ocean.keeper.didRegistry.getDIDOwner(id) const newOwner = await ocean.keeper.didRegistry.getDIDOwner(id)
assert.equal(newOwner, account2.getId()) assert.equal(newOwner, account2.getId())
// check aquarius
const aquariusOwner = await ocean.assets.owner(id)
assert.equal(aquariusOwner, account2.getId())
}) })
it('should add and remove correctly an address to/from FreeWhiteList on an asset', async () => { it('should add and remove correctly an address to/from FreeWhiteList on an asset', async () => {