Bladeren bron

storage cli: add command for bootrapping new chain with storage provider

Mokhtar Naamani 4 jaren geleden
bovenliggende
commit
8f657609a8

+ 3 - 0
storage-node/packages/cli/src/cli.ts

@@ -78,6 +78,9 @@ const commands = {
   'vstore-init': async (api, suri: string) => {
     return dev.vstoreInit(api, suri)
   },
+  'sudo-create-sp': async (api) => {
+    return dev.makeMemberInitialLeadAndStorageProvider(api)
+  },
   // Uploads the file to the system. Registers new data object in the runtime, obtains proper colossus instance URL.
   upload: async (
     api: any,

+ 99 - 1
storage-node/packages/cli/src/commands/dev.ts

@@ -215,4 +215,102 @@ const init = async (api: RuntimeApi): Promise<any> => {
   return check(api)
 }
 
-export { init, check, aliceKeyPair, roleKeyPair, developmentPort, vstoreInit }
+// Using sudo create initial storage lead and worker with given keys taken from env variables.
+// Used to quickly setup a storage provider on a new chain before a council is ready.
+const makeMemberInitialLeadAndStorageProvider = async (api: RuntimeApi): Promise<any> => {
+  const sudoKey = getKeyFromAddressOrSuri(api, process.env.SUDO_URI)
+  const memberId = parseInt(process.env.MEMBER_ID)
+  const memberController = getKeyFromAddressOrSuri(api, process.env.MEMBER_URI).address
+  const leadAccount = memberController
+  const workerAccount = process.env.WORKER_ACCOUNT
+
+  // make sure alice is sudo - indirectly checking this is a dev chain
+  const sudo = await api.identities.getSudoAccount()
+
+  if (!sudo.eq(sudoKey.address)) {
+    throw new Error('Provided SUDO_URI is not the chain sudo')
+  }
+
+  debug(`Creating Leader with role key: ${leadAccount}`)
+  debug('Creating Lead Opening')
+  const leadOpeningId = await api.workers.devAddStorageLeadOpening(getLeadOpeningInfo())
+  debug('Applying')
+  const leadApplicationId = await api.workers.devApplyOnOpening(leadOpeningId, memberId, memberController, leadAccount)
+  debug('Starting Review')
+  api.workers.devBeginLeadOpeningReview(leadOpeningId)
+  debug('Filling Opening')
+  await api.workers.devFillLeadOpening(leadOpeningId, leadApplicationId)
+
+  const setLeadAccount = await api.workers.getLeadRoleAccount()
+  if (!setLeadAccount.eq(leadAccount)) {
+    throw new Error('Setting Lead failed!')
+  }
+
+  // Create a storage openinging, apply, start review, and fill opening
+  debug(`Making ${workerAccount} account a storage provider.`)
+
+  const openingId = await api.workers.devAddStorageOpening(getWorkerOpeningInfo())
+  debug(`Created new storage opening: ${openingId}`)
+
+  const applicationId = await api.workers.devApplyOnOpening(openingId, memberId, memberController, workerAccount)
+  debug(`Applied with application id: ${applicationId}`)
+
+  api.workers.devBeginStorageOpeningReview(openingId)
+
+  debug(`Filling storage opening.`)
+  const providerId = await api.workers.devFillStorageOpening(openingId, applicationId)
+
+  debug(`Assigned storage provider id: ${providerId}`)
+}
+
+export { init, check, aliceKeyPair, roleKeyPair, developmentPort, vstoreInit, makeMemberInitialLeadAndStorageProvider }
+
+function getLeadOpeningInfo() {
+  return `{
+    "version": 1,
+    "headline": "Initial Storage Lead",
+    "job": {
+      "title": "Bootstrap Lead",
+      "description": "Starting opportunity to bootstrap the network"
+    },
+    "application": {
+      "sections": []
+    },
+    "reward": "None",
+    "creator": {
+      "membership": {
+        "handle": "mokhtar"
+      }
+    },
+    "process": {
+      "details": [
+        "automated"
+      ]
+    }
+  }`
+}
+
+function getWorkerOpeningInfo() {
+  return `{
+    "version": 1,
+    "headline": "Initial Storage Worker",
+    "job": {
+      "title": "Bootstrap Worker",
+      "description": "Starting opportunity to bootstrap the network"
+    },
+    "application": {
+      "sections": []
+    },
+    "reward": "None",
+    "creator": {
+      "membership": {
+        "handle": "mokhtar"
+      }
+    },
+    "process": {
+      "details": [
+        "automated"
+      ]
+    }
+  }`
+}

+ 7 - 7
storage-node/packages/runtime-api/workers.js

@@ -150,8 +150,8 @@ class WorkersApi {
    * Add a new storage group opening using the lead account. Returns the
    * new opening id.
    */
-  async devAddStorageOpening() {
-    const openTx = this.devMakeAddOpeningTx('Worker')
+  async devAddStorageOpening(info) {
+    const openTx = this.devMakeAddOpeningTx('Worker', info)
     return this.devSubmitAddOpeningTx(openTx, await this.getLeadRoleAccount())
   }
 
@@ -159,8 +159,8 @@ class WorkersApi {
    * Add a new storage working group lead opening using sudo account. Returns the
    * new opening id.
    */
-  async devAddStorageLeadOpening() {
-    const openTx = this.devMakeAddOpeningTx('Leader')
+  async devAddStorageLeadOpening(info) {
+    const openTx = this.devMakeAddOpeningTx('Leader', info)
     const sudoTx = this.base.api.tx.sudo.sudo(openTx)
     return this.devSubmitAddOpeningTx(sudoTx, await this.base.identities.getSudoAccount())
   }
@@ -168,17 +168,17 @@ class WorkersApi {
   /*
    * Constructs an addOpening tx of openingType
    */
-  devMakeAddOpeningTx(openingType) {
+  devMakeAddOpeningTx(openingType, info) {
     return this.base.api.tx.storageWorkingGroup.addOpening(
       'CurrentBlock',
       {
         application_rationing_policy: {
           max_active_applicants: 1,
         },
-        max_review_period_length: 1000,
+        max_review_period_length: 10,
         // default values for everything else..
       },
-      'dev-opening',
+      info || 'dev-opening',
       openingType
     )
   }