Skip to content

Commit 7a2a314

Browse files
NikolasHaimerlNikolas Haimerlbajtosjuliangruber
authored
feat: add index provider library (#143)
* add count of payload cid state * Update backend/bin/deal-observer-backend.js Co-authored-by: Miroslav Bajtoš <[email protected]> * Update backend/lib/look-up-payload-cids.js Co-authored-by: Miroslav Bajtoš <[email protected]> * changed testing * moved default active deal * changed storage function * fmt * add index lookup library * fix tests * cleanup * Update backend/bin/deal-observer-backend.js Co-authored-by: Julian Gruber <[email protected]> * resolve PR threads * fmt * removed default value * add secret to workflow * add secret to workflow * Update backend/lib/resolve-payload-cids.js Co-authored-by: Julian Gruber <[email protected]> * fmt * remove glif token during deployment * fix async test * Update backend/lib/resolve-payload-cids.js Co-authored-by: Julian Gruber <[email protected]> * Update backend/lib/resolve-payload-cids.js Co-authored-by: Julian Gruber <[email protected]> * removed redundant async --------- Co-authored-by: Nikolas Haimerl <[email protected]> Co-authored-by: Miroslav Bajtoš <[email protected]> Co-authored-by: Julian Gruber <[email protected]>
1 parent 6551c03 commit 7a2a314

File tree

9 files changed

+293
-61
lines changed

9 files changed

+293
-61
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ jobs:
5252
env:
5353
DATABASE_URL: postgres://postgres:postgres@localhost:5432/spark_deal_observer
5454
NPM_CONFIG_WORKSPACE: backend
55+
GLIF_TOKEN: ${{ secrets.GLIF_TOKEN }}
5556
steps:
5657
- uses: actions/checkout@v4
5758
- uses: actions/setup-node@v4

backend/bin/deal-observer-backend.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import '../lib/instrument.js'
77
import { createInflux } from '../lib/telemetry.js'
88
import { rpcRequest } from '../lib/rpc-service/service.js'
99
import { fetchDealWithHighestActivatedEpoch, countStoredActiveDeals, observeBuiltinActorEvents } from '../lib/deal-observer.js'
10-
import { countStoredActiveDealsWithUnresolvedPayloadCid, resolvePayloadCids, countRevertedActiveDeals, countStoredActiveDealsWithPayloadState } from '../lib/resolve-payload-cids.js'
10+
import { countStoredActiveDealsWithUnresolvedPayloadCid, resolvePayloadCids, countRevertedActiveDeals, countStoredActiveDealsWithPayloadState, getPeerId } from '../lib/resolve-payload-cids.js'
1111
import { findAndSubmitUnsubmittedDeals, submitDealsToSparkApi } from '../lib/spark-api-submit-deals.js'
1212
import { payloadCidRequest } from '../lib/piece-indexer-service.js'
1313
/** @import {Queryable} from '@filecoin-station/deal-observer-db' */
@@ -122,17 +122,16 @@ const sparkApiSubmitDealsLoop = async (pgPool, { sparkApiBaseUrl, sparkApiToken,
122122
}
123123

124124
/**
125-
* @param {MakeRpcRequest} makeRpcRequest
126125
* @param {MakePayloadCidRequest} makePayloadCidRequest
127126
* @param {Queryable} pgPool
128127
*/
129-
export const resolvePayloadCidsLoop = async (makeRpcRequest, makePayloadCidRequest, pgPool) => {
128+
export const resolvePayloadCidsLoop = async (makePayloadCidRequest, pgPool) => {
130129
while (true) {
131130
const start = Date.now()
132131
// Maximum number of deals to resolve payload CIDs for in one loop iteration
133132
const maxDeals = 1000
134133
try {
135-
const numOfPayloadCidsResolved = await resolvePayloadCids(makeRpcRequest, makePayloadCidRequest, pgPool, maxDeals)
134+
const numOfPayloadCidsResolved = await resolvePayloadCids(getPeerId, makePayloadCidRequest, pgPool, maxDeals)
136135
const totalNumOfUnresolvedPayloadCids = await countStoredActiveDealsWithUnresolvedPayloadCid(pgPool)
137136
const totalNumOfDealsWithPayloadCidResolved = await countStoredActiveDealsWithPayloadState(pgPool, 'PAYLOAD_CID_RESOLVED')
138137
const totalNumOfDealsWithPayloadCidUnresolved = await countStoredActiveDealsWithPayloadState(pgPool, 'PAYLOAD_CID_UNRESOLVED')
@@ -169,7 +168,7 @@ export const resolvePayloadCidsLoop = async (makeRpcRequest, makePayloadCidReque
169168
}
170169

171170
await Promise.all([
172-
resolvePayloadCidsLoop(rpcRequest, payloadCidRequest, pgPool),
171+
resolvePayloadCidsLoop(payloadCidRequest, pgPool),
173172
observeActorEventsLoop(rpcRequest, pgPool),
174173
sparkApiSubmitDealsLoop(pgPool, {
175174
sparkApiBaseUrl: SPARK_API_BASE_URL,

backend/lib/config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ if (RPC_URL.includes('glif') && GLIF_TOKEN) {
1717
export {
1818
RPC_URL,
1919
rpcHeaders,
20-
PIECE_INDEXER_URL
20+
PIECE_INDEXER_URL,
21+
GLIF_TOKEN
2122
}

backend/lib/resolve-payload-cids.js

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
import { loadDeals } from './deal-observer.js'
22
import * as util from 'node:util'
3-
import { getMinerPeerId } from './rpc-service/service.js'
43
import { PayloadRetrievabilityState } from '@filecoin-station/deal-observer-db/lib/types.js'
4+
import debug from 'debug'
5+
import { GLIF_TOKEN, RPC_URL } from './config.js'
6+
import { ethers } from 'ethers'
7+
import {
8+
getIndexProviderPeerId,
9+
MINER_TO_PEERID_CONTRACT_ADDRESS, MINER_TO_PEERID_CONTRACT_ABI
10+
// @ts-ignore
11+
} from 'index-provider-peer-id'
12+
import { rpcRequest } from './rpc-service/service.js'
13+
import assert from 'node:assert'
514

615
/** @import {Queryable} from '@filecoin-station/deal-observer-db' */
716
/** @import { Static } from '@sinclair/typebox' */
@@ -11,16 +20,18 @@ const THREE_DAYS_IN_MILLISECONDS = 1000 * 60 * 60 * 24 * 3
1120

1221
/**
1322
*
14-
* @param {import('./typings.js').MakeRpcRequest} makeRpcRequest
23+
* @param {import('./typings.js').GetIndexProviderPeerId} getIndexProviderPeerId
1524
* @param {import('./typings.js').MakePayloadCidRequest} makePayloadCidRequest
1625
* @param {Queryable} pgPool
1726
* @param {number} maxDeals
27+
* @param {number} [now] The current timestamp in milliseconds
1828
* @returns {Promise<number>}
1929
*/
20-
export const resolvePayloadCids = async (makeRpcRequest, makePayloadCidRequest, pgPool, maxDeals, now = Date.now()) => {
30+
export const resolvePayloadCids = async (getIndexProviderPeerId, makePayloadCidRequest, pgPool, maxDeals, now = Date.now()) => {
2131
let payloadCidsResolved = 0
2232
for (const deal of await fetchDealsWithUnresolvedPayloadCid(pgPool, maxDeals, new Date(now - THREE_DAYS_IN_MILLISECONDS))) {
23-
const minerPeerId = await getMinerPeerId(deal.miner_id, makeRpcRequest)
33+
const { peerId: minerPeerId, source } = await getIndexProviderPeerId(deal.miner_id)
34+
debug(`Using PeerID from ${source}.`)
2435
const payloadCid = await makePayloadCidRequest(minerPeerId, deal.piece_cid)
2536
if (payloadCid) deal.payload_cid = payloadCid
2637
if (!deal.payload_cid) {
@@ -106,3 +117,31 @@ async function updatePayloadCidInActiveDeal (pgPool, deal, newPayloadRetrievalSt
106117
throw Error(util.format('Error updating payload of deal: ', deal), { cause: error })
107118
}
108119
}
120+
121+
function getSmartContractClient () {
122+
const fetchRequest = new ethers.FetchRequest(RPC_URL)
123+
assert(GLIF_TOKEN, 'GLIF_TOKEN is required')
124+
fetchRequest.setHeader('Authorization', `Bearer ${GLIF_TOKEN}`)
125+
const provider = new ethers.JsonRpcProvider(fetchRequest)
126+
return new ethers.Contract(
127+
MINER_TO_PEERID_CONTRACT_ADDRESS,
128+
MINER_TO_PEERID_CONTRACT_ABI,
129+
provider
130+
)
131+
}
132+
const defaultSmartContractClient = getSmartContractClient()
133+
134+
/**
135+
* @param {number} minerId
136+
* @param {object} [options]
137+
* @param {unknown} options.smartContract
138+
* @param {import('./typings.js').MakeRpcRequest} options.makeRpcRequest
139+
* @returns {Promise<{ peerId: string, source: string }>}
140+
*/
141+
export const getPeerId = async (minerId, { smartContract, makeRpcRequest } = { smartContract: defaultSmartContractClient, makeRpcRequest: rpcRequest }) => {
142+
return await getIndexProviderPeerId(
143+
`f0${minerId}`,
144+
smartContract,
145+
{ rpcFn: makeRpcRequest }
146+
)
147+
}

backend/lib/rpc-service/service.js

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -96,28 +96,6 @@ export async function getChainHead (makeRpcRequest) {
9696
}
9797
}
9898

99-
/**
100-
* @param {number} minerId
101-
* @param {MakeRpcRequest} makeRpcRequest
102-
* @returns {Promise<string>}
103-
*/
104-
export async function getMinerPeerId (minerId, makeRpcRequest) {
105-
/** @typedef {{
106-
* PeerId: string;
107-
* }} MinerInfo
108-
*/
109-
try {
110-
const params = getMinerInfoCallParams(minerId)
111-
const res = /** @type {MinerInfo} */(await makeRpcRequest('Filecoin.StateMinerInfo', params))
112-
if (!res || !res.PeerId) {
113-
throw Error(`Failed to get peer ID for miner ${minerId}, result: ${res}`)
114-
}
115-
return res.PeerId
116-
} catch (err) {
117-
throw Error(`Failed to get peer ID for miner ${minerId}.`, { cause: err })
118-
}
119-
}
120-
12199
/**
122100
* @param {number} blockHeight
123101
* @param {string} eventTypeString
@@ -134,13 +112,3 @@ export function getActorEventsFilter (blockHeight, eventTypeString) {
134112
}
135113
}
136114
}
137-
138-
/**
139-
* @param {number} minerId
140-
*/
141-
export function getMinerInfoCallParams (minerId) {
142-
return [
143-
'f0' + minerId.toString(),
144-
null
145-
]
146-
}

backend/lib/typings.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export type MakeRpcRequest = (method: string, params: unknown[]) => Promise<unknown>;
22
export type MakePayloadCidRequest = (providerId:string,pieceCid:string) => Promise<string|null>;
3+
export type GetIndexProviderPeerId = ( minerId:number ) => Promise<{ peerId: string, source: string }>;

backend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"@sentry/node": "^9.11.0",
2323
"@sinclair/typebox": "^0.34.33",
2424
"debug": "^4.4.0",
25+
"ethers": "^6.13.5",
26+
"index-provider-peer-id": "^1.0.0",
2527
"multiformats": "^13.3.2",
2628
"p-retry": "^6.2.1",
2729
"pg": "^8.14.1",

0 commit comments

Comments
 (0)