diff --git a/server/common/constant.js b/server/common/constant.js index 71bc01d..4c97859 100644 --- a/server/common/constant.js +++ b/server/common/constant.js @@ -3,8 +3,10 @@ const EVENTDB_STATE_HANDLED = 1; const GAMEDB_NAME = 'GameDb0'; const BCEVENTDB_NAME = 'BcEventDb0'; +const BCNFTDB_NAME = 'BcNftDb0'; exports.EVENTDB_STATE_PENDING = EVENTDB_STATE_PENDING; exports.EVENTDB_STATE_HANDLED = EVENTDB_STATE_HANDLED; exports.GAMEDB_NAME = GAMEDB_NAME; exports.BCEVENTDB_NAME = BCEVENTDB_NAME; +exports.BCNFTDB_NAME = BCNFTDB_NAME; diff --git a/server/web3bcspider/services/blockchain.js b/server/web3bcspider/services/blockchain.js index 83f574f..eb589b0 100644 --- a/server/web3bcspider/services/blockchain.js +++ b/server/web3bcspider/services/blockchain.js @@ -39,7 +39,7 @@ class BlockChain extends BaseService { } getCurrBlockNumber() { - return this.#bc.currBlockNumber; + return this.#bc.getCurrBlockNumber(); } async lockQuery() { diff --git a/server/web3bcspider/services/erc721_refresher.js b/server/web3bcspider/services/erc721_refresher.js index 00daa85..4b19f90 100644 --- a/server/web3bcspider/services/erc721_refresher.js +++ b/server/web3bcspider/services/erc721_refresher.js @@ -41,6 +41,14 @@ class Erc721Refresher extends BaseService { if (err) { throw err; } + if (rows.length > 0) { + await utils.serial( + rows, + async (row) => { + await this.refresh(row); + } + ); + } } catch (err) { log.error(logHead + err); await utils.sleep(5000 + utils.randRange(1000, 3000)); @@ -64,6 +72,61 @@ class Erc721Refresher extends BaseService { return head; } + async refresh(row) { + while (true) { + await this.bc.mustBeActive(); + const oldBlockNumber = this.bc.getCurrBlockNumber(); + let oldOwner = await this.getOwner(); + while (oldBlockNumber + 8 > this.bc.getCurrBlockNumber()) { + await utils.sleep(1000 + utils.randRange(0, 500)); + } + + await this.bc.mustBeActive(); + const newBlockNumber = this.bc.getCurrBlockNumber(); + let newOwner = await this.getOwner(); + + if (oldOwner == newOwner) { + const ok = await this.updateConfirmed(newOwner, oldBlockNumber, row); + if (ok) { + break; + } + } + await utils.sleep(1000 + utils.randRange(500, 1500)); + + } + } + + async updateConfirmed(newOwner, blockNumber, row) { + const {err, nftDbConn} = await app.getDbConn(constant.BCNFTDB_NAME); + if (err) { + log.error('updateConfirmed:' + this.tokenId + ' err:' + err); + return false; + } + try { + { + const {err} = await nftDbConn.update( + 't_nft', + [ + ['net_id', row['net_id']], + ['token_id', row['token_id']], + ['contract_address', row['contract_address']], + ], + [ + ['owner_address', bcutils.toNormalAddress(newOwner)], + ['confirm_count', this.nftDb['confirm_count'] + 1], + ['confirm_block_number', blockNumber] + ]); + if (err) { + log.error('updateConfirmed:' + this.tokenId + ' err:' + err); + return false; + } + } + } finally { + nftDbConn.release(); + } + return true; + } + } module.exports = Erc721Refresher;