Skip to content

Commit

Permalink
finished substrate
Browse files Browse the repository at this point in the history
  • Loading branch information
troykessler committed Jul 13, 2022
1 parent eb7d204 commit f659805
Show file tree
Hide file tree
Showing 5 changed files with 285 additions and 218 deletions.
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "@kyve/substrate",
"version": "0.1.3",
"version": "0.3.0",
"license": "MIT",
"scripts": {
"build": "rimraf dist && tsc",
"build:binaries": "yarn build && rimraf out && pkg --no-bytecode --public-packages '*' --output out/kyve package.json && node ./node_modules/@kyve/core/dist/src/checksum.js",
"build:binaries": "yarn build && rimraf out && pkg --no-bytecode --public-packages '*' --output out/kyve package.json && node ./node_modules/@kyve/core/dist/src/scripts/checksum.js",
"start": "node ./dist/src/index.js",
"format": "prettier --write ."
},
Expand All @@ -22,7 +22,7 @@
"singleQuote": true
},
"dependencies": {
"@kyve/core": "1.2.3",
"@kyve/core": "1.3.0",
"axios": "^0.27.2"
},
"devDependencies": {
Expand Down
70 changes: 8 additions & 62 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,64 +1,10 @@
import KYVE, { Item } from '@kyve/core';
import { Signature } from './types';
import { fetchBlock, isHeightOutOfRange } from './utils';
import { name, version } from '../package.json';
import { Node, Arweave, Gzip, JsonFileCache } from '@kyve/core';

process.env.KYVE_RUNTIME = name;
process.env.KYVE_VERSION = version;
import Substrate from './runtime';

KYVE.metrics.register.setDefaultLabels({
app: process.env.KYVE_RUNTIME,
});

class KyveSubstrate extends KYVE {
public async getDataItem(key: string): Promise<Item> {
let block;

try {
block = await fetchBlock(
this.pool.config.rpc,
+key,
await this.getSignature()
);
} catch (err) {
if (isHeightOutOfRange(err)) throw new Error();

this.logger.warn(`Failed to fetch block ${key}. Retrying ...`);

throw err;
}

return { key, value: block };
}

public async getNextKey(key: string): Promise<string> {
if (key) {
return (parseInt(key) + 1).toString();
}

return '0';
}

public async formatValue(value: any): Promise<string> {
return value.hash;
}

private async getSignature(): Promise<Signature> {
const address = await this.sdk.wallet.getAddress();
const timestamp = new Date().valueOf().toString();

const message = `${address}//${this.poolId}//${timestamp}`;

const { signature, pub_key } = await this.sdk.signString(message);

return {
signature,
pubKey: pub_key.value,
poolId: this.poolId.toString(),
timestamp,
};
}
}

// noinspection JSIgnoredPromiseFromCall
new KyveSubstrate().start();
new Node()
.addRuntime(new Substrate())
.addStorageProvider(new Arweave())
.addCompression(new Gzip())
.addCache(new JsonFileCache())
.start();
51 changes: 51 additions & 0 deletions src/runtime.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { DataItem, IRuntime, Node } from '@kyve/core';
import { name, version } from '../package.json';
import { fetchBlock, isHeightOutOfRange } from './utils';

export default class Substrate implements IRuntime {
public name = name;
public version = version;

public async getDataItem(core: Node, key: string): Promise<DataItem> {
let block;

const headers = await this.generateCoinbaseCloudHeaders(core);

try {
block = await fetchBlock(core.poolConfig.rpc, +key, headers);
} catch (err) {
if (isHeightOutOfRange(err)) throw new Error();

throw err;
}

return { key, value: block };
}

public async getNextKey(key: string): Promise<string> {
return (parseInt(key) + 1).toString();
}

public async formatValue(value: any): Promise<string> {
return value.hash;
}

private async generateCoinbaseCloudHeaders(core: Node): Promise<any> {
// requestSignature for coinbase cloud
const address = core.client.account.address;
const timestamp = new Date().valueOf().toString();
const poolId = core.pool.id;

const { signature, pub_key } = await core.client.signString(
`${address}//${poolId}//${timestamp}`
);

return {
'Content-Type': 'application/json',
Signature: signature,
'Public-Key': pub_key.value,
'Pool-ID': poolId,
Timestamp: timestamp,
};
}
}
14 changes: 4 additions & 10 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import { Signature, UNABLE_TO_RETRIEVE } from './types';
export async function fetchBlock(
endpoint: string,
height: number,
signature: Signature
headers: any
) {
return await requestSidecarAPI(`${endpoint}/blocks/${height}`, signature);
return await requestSidecarAPI(`${endpoint}/blocks/${height}`, headers);
}

export function isHeightOutOfRange(err: any): boolean {
Expand All @@ -23,15 +23,9 @@ export function isHeightOutOfRange(err: any): boolean {
return false;
}

async function requestSidecarAPI(endpoint: string, signature: Signature) {
async function requestSidecarAPI(endpoint: string, headers: any) {
const { data } = await axios.get(endpoint, {
headers: {
'Content-Type': 'application/json',
Signature: signature.signature,
'Public-Key': signature.pubKey,
'Pool-ID': signature.poolId,
Timestamp: signature.timestamp,
},
headers,
});

return data;
Expand Down
Loading

0 comments on commit f659805

Please sign in to comment.