1
0
mirror of https://github.com/oceanprotocol/ocean.js.git synced 2024-11-26 20:39:05 +01:00

Multichain Provider (#1698)

* added chainId param to encrypt method

* updated tests & examples
This commit is contained in:
Bogdan Fazakas 2023-03-20 15:44:12 +02:00 committed by GitHub
parent 849c575d08
commit 5a29fefd3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 98 additions and 46 deletions

View File

@ -4,9 +4,32 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [v2.7.0-next.2](https://github.com/oceanprotocol/ocean.js/compare/v2.7.0-next.1...v2.7.0-next.2)
- fix isValid provider method [`010306c`](https://github.com/oceanprotocol/ocean.js/commit/010306c92e003021b08df0b8b8ad6743ae6b240c)
#### [v2.7.0-next.1](https://github.com/oceanprotocol/ocean.js/compare/v2.7.0-next.0...v2.7.0-next.1)
> 22 February 2023
- Release 2.7.0-next.0 [`500062b`](https://github.com/oceanprotocol/ocean.js/commit/500062beb575b21ab7210a675bdf5174d11842c8)
- Updating CodeExamples.md [`6cc891a`](https://github.com/oceanprotocol/ocean.js/commit/6cc891a5da9e4042e3eee243b651e8a7188d1786)
- Release 2.7.0-next.1 [`ba27412`](https://github.com/oceanprotocol/ocean.js/commit/ba2741296167de4c112560f2807b1a45e86eba94)
#### [v2.7.0-next.0](https://github.com/oceanprotocol/ocean.js/compare/v2.6.3...v2.7.0-next.0)
> 21 February 2023
- add needed multichain provider changes [`95551ee`](https://github.com/oceanprotocol/ocean.js/commit/95551eeb669395357149dd923ecec304955add14)
- Release 2.7.0-next.0 [`95886a1`](https://github.com/oceanprotocol/ocean.js/commit/95886a184faadd4a13e857e285e016ef4c20966f)
- fix code example [`c4a00e4`](https://github.com/oceanprotocol/ocean.js/commit/c4a00e45848ace6a4fe3d4fa1a2aeac518aa44ce)
#### [v2.6.3](https://github.com/oceanprotocol/ocean.js/compare/v2.6.2...v2.6.3)
> 13 February 2023
- add macOS readme message [`#1697`](https://github.com/oceanprotocol/ocean.js/pull/1697)
- Release 2.6.3 [`53f0c53`](https://github.com/oceanprotocol/ocean.js/commit/53f0c536a9bc683676a513edb61faf2dfd9c0262)
#### [v2.6.2](https://github.com/oceanprotocol/ocean.js/compare/v2.6.1...v2.6.2)

View File

@ -350,7 +350,11 @@ Next, let's encrypt the file(s) using provider
```Typescript
ASSET_URL.datatokenAddress = freDatatokenAddress
ASSET_URL.nftAddress = freNftAddress
const encryptedFiles = await ProviderInstance.encrypt(ASSET_URL, providerUrl)
const encryptedFiles = await ProviderInstance.encrypt(
ASSET_URL,
DDO.chainId,
providerUrl
)
DDO.services[0].files = await encryptedFiles
DDO.services[0].datatokenAddress = freDatatokenAddress
@ -359,7 +363,7 @@ Now let's console log the DID to check everything is working
```Typescript
console.log(`DID: ${DDO.id}`)
const providerResponse = await ProviderInstance.encrypt(DDO, providerUrl)
const providerResponse = await ProviderInstance.encrypt(DDO, DDO.chainId, providerUrl)
const encryptedDDO = await providerResponse
const metadataHash = getHash(JSON.stringify(DDO))
await nft.setMetadata(
@ -567,13 +571,17 @@ Now we need to encrypt file(s) using provider
```Typescript
ASSET_URL.datatokenAddress = dispenserDatatokenAddress
ASSET_URL.nftAddress = dispenserNftAddress
const encryptedFiles = await ProviderInstance.encrypt(ASSET_URL, providerUrl)
const encryptedFiles = await ProviderInstance.encrypt(
ASSET_URL,
DDO.chainId,
providerUrl
)
DDO.services[0].files = await encryptedFiles
DDO.services[0].datatokenAddress = dispenserDatatokenAddress
console.log(`DID: ${DDO.id}`)
const providerResponse = await ProviderInstance.encrypt(DDO, providerUrl)
const providerResponse = await ProviderInstance.encrypt(DDO, DDO.chainId, providerUrl)
const encryptedDDO = await providerResponse
const metadataHash = getHash(JSON.stringify(DDO))
await nft.setMetadata(

View File

@ -329,7 +329,7 @@ async function createAsset(
// Next we encrypt the file or files using Ocean Provider. The provider is an off chain proxy built specifically for this task
assetUrl.datatokenAddress = datatokenAddressAsset
assetUrl.nftAddress = ddo.nftAddress
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
let providerResponse = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
ddo.services[0].files = await providerResponse
ddo.services[0].datatokenAddress = datatokenAddressAsset
ddo.services[0].serviceEndpoint = providerUrl
@ -338,7 +338,7 @@ async function createAsset(
ddo.nftAddress = web3.utils.toChecksumAddress(nftAddress)
ddo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
const encryptedResponse = await providerResponse
const validateResult = await aquarius.validate(ddo)
@ -583,7 +583,9 @@ Now, let's check that we successfully published a algorithm (create NFT + Datato
### 10.1 Start a compute job using a free C2D environment
let's check the free compute environment
```Typescript
const computeEnv = computeEnvs.find((ce) => ce.priceMin === 0)
const computeEnv = computeEnvs[resolvedDatasetDdo.chainId].find(
(ce) => ce.priceMin === 0
)
console.log('Free compute environment = ', computeEnv)
```
<!--

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "@oceanprotocol/lib",
"version": "2.6.3",
"version": "2.7.0-next.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@oceanprotocol/lib",
"version": "2.6.3",
"version": "2.7.0-next.2",
"license": "Apache-2.0",
"dependencies": {
"@oceanprotocol/contracts": "^1.1.8",

View File

@ -1,7 +1,7 @@
{
"name": "@oceanprotocol/lib",
"source": "./src/index.ts",
"version": "2.6.3",
"version": "2.7.0-next.2",
"description": "JavaScript client library for Ocean Protocol",
"main": "./dist/lib.js",
"umd:main": "dist/lib.umd.js",

View File

@ -8,7 +8,7 @@ const configHelperNetworksBase: Config = {
network: 'unknown',
metadataCacheUri: 'https://v4.aquarius.oceanprotocol.com',
nodeUri: 'http://127.0.0.1:8545',
providerUri: 'http://127.0.0.1:8030',
providerUri: 'https://v4.provider.oceanprotocol.com',
subgraphUri: null,
explorerUri: null,
oceanTokenAddress: null,
@ -40,7 +40,6 @@ export const configHelperNetworks: Config[] = [
chainId: 5,
network: 'goerli',
nodeUri: 'https://goerli.infura.io/v3',
providerUri: 'https://v4.provider.goerli.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.goerli.oceanprotocol.com',
explorerUri: 'https://goerli.etherscan.io',
gasFeeMultiplier: 1.1
@ -50,7 +49,6 @@ export const configHelperNetworks: Config[] = [
chainId: 1,
network: 'mainnet',
nodeUri: 'https://mainnet.infura.io/v3',
providerUri: 'https://v4.provider.mainnet.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.mainnet.oceanprotocol.com',
explorerUri: 'https://etherscan.io',
startBlock: 11105459,
@ -64,7 +62,6 @@ export const configHelperNetworks: Config[] = [
chainId: 137,
network: 'polygon',
nodeUri: 'https://polygon-mainnet.infura.io/v3',
providerUri: 'https://v4.provider.polygon.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.polygon.oceanprotocol.com',
explorerUri: 'https://polygonscan.com',
oceanTokenSymbol: 'mOCEAN',
@ -84,7 +81,6 @@ export const configHelperNetworks: Config[] = [
chainId: 80001,
network: 'mumbai',
nodeUri: 'https://polygon-mumbai.infura.io/v3',
providerUri: 'https://v4.provider.mumbai.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.mumbai.oceanprotocol.com',
explorerUri: 'https://mumbai.polygonscan.com',
gasFeeMultiplier: 1.1
@ -94,7 +90,6 @@ export const configHelperNetworks: Config[] = [
chainId: 56,
network: 'bsc',
nodeUri: 'https://bsc-dataseed.binance.org',
providerUri: 'https://v4.provider.bsc.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.bsc.oceanprotocol.com',
explorerUri: 'https://bscscan.com/',
gasFeeMultiplier: 1.05
@ -104,7 +99,6 @@ export const configHelperNetworks: Config[] = [
chainId: 246,
network: 'energyweb',
nodeUri: 'https://rpc.energyweb.org',
providerUri: 'https://v4.provider.energyweb.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.energyweb.oceanprotocol.com',
explorerUri: 'https://explorer.energyweb.org',
gasFeeMultiplier: 1.05
@ -114,7 +108,6 @@ export const configHelperNetworks: Config[] = [
chainId: 1285,
network: 'moonriver',
nodeUri: 'https://moonriver.api.onfinality.io/public',
providerUri: 'https://v4.provider.moonriver.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.moonriver.oceanprotocol.com',
explorerUri: 'https://moonriver.moonscan.io/',
gasFeeMultiplier: 1.05

View File

@ -117,12 +117,14 @@ export class Provider {
/** Encrypt data using the Provider's own symmetric key
* @param {string} data data in json format that needs to be sent , it can either be a DDO or a File array
* @param {number} chainId network's id so provider can choose the corresponding web3 object
* @param {string} providerUri provider uri address
* @param {AbortSignal} signal abort signal
* @return {Promise<string>} urlDetails
*/
public async encrypt(
data: any,
chainId: number,
providerUri: string,
signal?: AbortSignal
): Promise<string> {
@ -131,9 +133,10 @@ export class Provider {
providerUri,
providerEndpoints
)
const path = this.getEndpointURL(serviceEndpoints, 'encrypt')
? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath
: null
const path =
(this.getEndpointURL(serviceEndpoints, 'encrypt')
? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath
: null) + `?chainId=${chainId}`
if (!path) return null
try {
const response = await fetch(path, {
@ -747,7 +750,7 @@ export class Provider {
})
if (response?.ok) {
const params = await response.json()
if (params && params.providerAddress) return true
if (params && (params.providerAddress || params.providerAddresses)) return true
}
return false
} catch (error) {

View File

@ -350,7 +350,11 @@ describe('Marketplace flow tests', async () => {
/// ```Typescript
ASSET_URL.datatokenAddress = freDatatokenAddress
ASSET_URL.nftAddress = freNftAddress
const encryptedFiles = await ProviderInstance.encrypt(ASSET_URL, providerUrl)
const encryptedFiles = await ProviderInstance.encrypt(
ASSET_URL,
DDO.chainId,
providerUrl
)
DDO.services[0].files = await encryptedFiles
DDO.services[0].datatokenAddress = freDatatokenAddress
@ -359,7 +363,7 @@ describe('Marketplace flow tests', async () => {
/// ```Typescript
console.log(`DID: ${DDO.id}`)
const providerResponse = await ProviderInstance.encrypt(DDO, providerUrl)
const providerResponse = await ProviderInstance.encrypt(DDO, DDO.chainId, providerUrl)
const encryptedDDO = await providerResponse
const metadataHash = getHash(JSON.stringify(DDO))
await nft.setMetadata(
@ -567,13 +571,17 @@ describe('Marketplace flow tests', async () => {
/// ```Typescript
ASSET_URL.datatokenAddress = dispenserDatatokenAddress
ASSET_URL.nftAddress = dispenserNftAddress
const encryptedFiles = await ProviderInstance.encrypt(ASSET_URL, providerUrl)
const encryptedFiles = await ProviderInstance.encrypt(
ASSET_URL,
DDO.chainId,
providerUrl
)
DDO.services[0].files = await encryptedFiles
DDO.services[0].datatokenAddress = dispenserDatatokenAddress
console.log(`DID: ${DDO.id}`)
const providerResponse = await ProviderInstance.encrypt(DDO, providerUrl)
const providerResponse = await ProviderInstance.encrypt(DDO, DDO.chainId, providerUrl)
const encryptedDDO = await providerResponse
const metadataHash = getHash(JSON.stringify(DDO))
await nft.setMetadata(

View File

@ -329,7 +329,7 @@ async function createAsset(
// Next we encrypt the file or files using Ocean Provider. The provider is an off chain proxy built specifically for this task
assetUrl.datatokenAddress = datatokenAddressAsset
assetUrl.nftAddress = ddo.nftAddress
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
let providerResponse = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
ddo.services[0].files = await providerResponse
ddo.services[0].datatokenAddress = datatokenAddressAsset
ddo.services[0].serviceEndpoint = providerUrl
@ -338,7 +338,7 @@ async function createAsset(
ddo.nftAddress = web3.utils.toChecksumAddress(nftAddress)
ddo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
const encryptedResponse = await providerResponse
const validateResult = await aquarius.validate(ddo)
@ -583,7 +583,9 @@ describe('Compute-to-data example tests', async () => {
it('10.1 Start a compute job using a free C2D environment', async () => {
/// let's check the free compute environment
/// ```Typescript
const computeEnv = computeEnvs.find((ce) => ce.priceMin === 0)
const computeEnv = computeEnvs[resolvedDatasetDdo.chainId].find(
(ce) => ce.priceMin === 0
)
console.log('Free compute environment = ', computeEnv)
/// ```
/// <!--

View File

@ -276,7 +276,7 @@ async function createAsset(
// create the files encrypted string
assetUrl.datatokenAddress = datatokenAddressAsset
assetUrl.nftAddress = ddo.nftAddress
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
let providerResponse = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
ddo.services[0].files = await providerResponse
ddo.services[0].datatokenAddress = datatokenAddressAsset
ddo.services[0].serviceEndpoint = providerUrl
@ -284,7 +284,7 @@ async function createAsset(
ddo.nftAddress = web3.utils.toChecksumAddress(nftAddress)
ddo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
const encryptedResponse = await providerResponse
const validateResult = await aquarius.validate(ddo)
assert(validateResult.valid, 'Could not validate metadata')
@ -486,7 +486,9 @@ describe('Simple compute tests', async () => {
computeValidUntil = Math.floor(mytime.getTime() / 1000)
// we choose the free env
const computeEnv = computeEnvs.find((ce) => ce.priceMin === 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin === 0
)
assert(computeEnv, 'Cannot find the free compute env')
const assets: ComputeAsset[] = [
@ -562,7 +564,9 @@ describe('Simple compute tests', async () => {
// move to start orders with initial txid's and provider fees
it('should restart a computeJob without paying anything, because order is valid and providerFees are still valid', async () => {
// we choose the free env
const computeEnv = computeEnvs.find((ce) => ce.priceMin === 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin === 0
)
assert(computeEnv, 'Cannot find the free compute env')
const assets: ComputeAsset[] = [
@ -623,7 +627,9 @@ describe('Simple compute tests', async () => {
it('should start a computeJob on a paid environment', async () => {
// we choose the paid env
const computeEnv = computeEnvs.find((ce) => ce.priceMin !== 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin !== 0
)
assert(computeEnv, 'Cannot find the paid compute env')
const assets: ComputeAsset[] = [
@ -695,7 +701,9 @@ describe('Simple compute tests', async () => {
it('should restart a computeJob on paid environment, without paying anything, because order is valid and providerFees are still valid', async () => {
// we choose the paid env
const computeEnv = computeEnvs.find((ce) => ce.priceMin !== 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin !== 0
)
assert(computeEnv, 'Cannot find the free compute env')
const assets: ComputeAsset[] = [
@ -764,7 +772,9 @@ describe('Simple compute tests', async () => {
it('should start a computeJob using the free environment, by paying only providerFee (reuseOrder)', async () => {
// we choose the free env
const computeEnv = computeEnvs.find((ce) => ce.priceMin === 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin === 0
)
assert(computeEnv, 'Cannot find the free compute env')
const assets: ComputeAsset[] = [
@ -844,7 +854,9 @@ describe('Simple compute tests', async () => {
it('should start a computeJob using the paid environment, by paying only providerFee (reuseOrder)', async () => {
// we choose the paid env
const computeEnv = computeEnvs.find((ce) => ce.priceMin !== 0)
const computeEnv = computeEnvs[resolvedDdoWith5mTimeout.chainId].find(
(ce) => ce.priceMin !== 0
)
assert(computeEnv, 'Cannot find the free compute env')
const assets: ComputeAsset[] = [

View File

@ -146,14 +146,15 @@ describe('Publish tests', async () => {
const datatokenAddress = bundleNFT.events.TokenCreated.returnValues[0]
assetUrl.datatokenAddress = datatokenAddress
assetUrl.nftAddress = nftAddress
const encryptedFiles = await ProviderInstance.encrypt(assetUrl, providerUrl)
const chain = await web3.eth.getChainId()
const encryptedFiles = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
fixedPriceDdo.metadata.name = 'test-dataset-fixedPrice'
fixedPriceDdo.services[0].files = await encryptedFiles
fixedPriceDdo.services[0].datatokenAddress = datatokenAddress
fixedPriceDdo.nftAddress = nftAddress
const chain = await web3.eth.getChainId()
fixedPriceDdo.chainId = chain
fixedPriceDdo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
@ -161,7 +162,7 @@ describe('Publish tests', async () => {
const isAssetValid: ValidateMetadata = await aquarius.validate(fixedPriceDdo)
assert(isAssetValid.valid === true, 'Published asset is not valid')
const encryptedDdo = await ProviderInstance.encrypt(fixedPriceDdo, providerUrl)
const encryptedDdo = await ProviderInstance.encrypt(fixedPriceDdo, chain, providerUrl)
const encryptedResponse = await encryptedDdo
const metadataHash = getHash(JSON.stringify(fixedPriceDdo))
// this is publishing with an explicit empty metadataProofs
@ -221,13 +222,13 @@ describe('Publish tests', async () => {
const datatokenAddress = bundleNFT.events.TokenCreated.returnValues[0]
assetUrl.datatokenAddress = datatokenAddress
assetUrl.nftAddress = nftAddress
const encryptedFiles = await ProviderInstance.encrypt(assetUrl, providerUrl)
const chain = await web3.eth.getChainId()
const encryptedFiles = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
dispenserDdo.metadata.name = 'test-dataset-dispenser'
dispenserDdo.services[0].files = await encryptedFiles
dispenserDdo.services[0].datatokenAddress = datatokenAddress
dispenserDdo.nftAddress = nftAddress
const chain = await web3.eth.getChainId()
dispenserDdo.chainId = chain
dispenserDdo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
@ -235,7 +236,7 @@ describe('Publish tests', async () => {
const isAssetValid: ValidateMetadata = await aquarius.validate(dispenserDdo)
assert(isAssetValid.valid === true, 'Published asset is not valid')
const encryptedDdo = await ProviderInstance.encrypt(dispenserDdo, providerUrl)
const encryptedDdo = await ProviderInstance.encrypt(dispenserDdo, chain, providerUrl)
const encryptedResponse = await encryptedDdo
const metadataHash = getHash(JSON.stringify(dispenserDdo))
// this is publishing with any explicit metadataProofs

View File

@ -148,16 +148,16 @@ describe('Simple Publish & consume test', async () => {
// create the files encrypted string
assetUrl.datatokenAddress = datatokenAddress
assetUrl.nftAddress = nftAddress
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
const chain = await web3.eth.getChainId()
let providerResponse = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
ddo.services[0].files = await providerResponse
ddo.services[0].datatokenAddress = datatokenAddress
// update ddo and set the right did
ddo.nftAddress = nftAddress
const chain = await web3.eth.getChainId()
ddo.id =
'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10))
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
const encryptedResponse = await providerResponse
const metadataHash = getHash(JSON.stringify(ddo))
await nft.setMetadata(