From 1e624b58ef28f858a82b14c5d19027574b145f8c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 22 Apr 2022 00:12:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=8B=E4=BB=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/web3helper/C.js | 2 + server/web3helper/services/event_center.js | 14 ++++++ .../web3helper/services/exec_confirm_owner.js | 49 +++++++++++-------- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/server/web3helper/C.js b/server/web3helper/C.js index 92efb24..6b457bd 100644 --- a/server/web3helper/C.js +++ b/server/web3helper/C.js @@ -1,3 +1,5 @@ const BC_INITIALIZED_EVENT = 'bc_initialized'; +const DESTORY_EXEC_CONFIRM_OWNER_EVENT = 'destory_exec_confirm_owner_event'; exports.BC_INITIALIZED_EVENT = BC_INITIALIZED_EVENT; +exports.DESTORY_EXEC_CONFIRM_OWNER_EVENT = DESTORY_EXEC_CONFIRM_OWNER_EVENT; diff --git a/server/web3helper/services/event_center.js b/server/web3helper/services/event_center.js index b0b9a42..139e6dc 100644 --- a/server/web3helper/services/event_center.js +++ b/server/web3helper/services/event_center.js @@ -2,9 +2,11 @@ const app = require('j7/app'); const utils = require('j7/utils'); const bcutils = require('j7/bcutils'); const log = require('j7/log'); +const event = require('j7/event'); const serviceFactory = require('./factory'); const metaFactory = require('../metadata/factory'); const bc = require('../blockchain'); +const C = require('../C'); const LIMIT_COUNT = 100; @@ -20,6 +22,17 @@ class EventCenter { } this.conn = conn; + event.addListener(C.DESTORY_EXEC_CONFIRM_OWNER_EVENT, (tokenId) => { + log.info('destory:' + tokenId); + try { + if (utils.getVal(this.pendingConfirmOwnerHash, tokenId)) { + delete this.pendingConfirmOwnerHash[tokenId]; + } + } catch(err) { + log.error('destory confirm owner:' + err); + } + }); + this.confirmOwner(); this.pullNftTransferEvent(); this.pullBoxOpenedEvent(); @@ -55,6 +68,7 @@ class EventCenter { } if (rows.length < 1 && this.lastIdx + LIMIT_COUNT < maxIdx) { this.lastIdx += LIMIT_COUNT; + continue; } } } diff --git a/server/web3helper/services/exec_confirm_owner.js b/server/web3helper/services/exec_confirm_owner.js index 9f36439..246c7d2 100644 --- a/server/web3helper/services/exec_confirm_owner.js +++ b/server/web3helper/services/exec_confirm_owner.js @@ -2,13 +2,15 @@ const bcutils = require('j7/bcutils'); const utils = require('j7/utils'); const app = require('j7/app'); const log = require('j7/log'); +const event = require('j7/event'); const bc = require('../blockchain'); +const C = require('../C'); class ExecConfirmOwner { async init(tokenId) { try { - this.tryCount = 0; + this.tryCount = 1; this.tokenId = tokenId; this.nftDb = await this.getNftDb(tokenId); if (!this.nftDb) { @@ -24,7 +26,7 @@ class ExecConfirmOwner { } destory() { - + event.emitEvent(C.DESTORY_EXEC_CONFIRM_OWNER_EVENT, this.tokenId); } addTryCount() { @@ -33,16 +35,18 @@ class ExecConfirmOwner { async doConfirm() { while (true) { - const oldTryCount = this.tryCount; await bc.mustBeActive(); + const oldTryCount = this.tryCount; const oldBlockNumber = bc.getCurrBlockNumber(); let oldOwner = await this.getOwner(); while (oldBlockNumber + 8 < bc.getCurrBlockNumber()) { await utils.sleep(1000 + utils.randRange(0, 500)); } + await bc.mustBeActive(); const newBlockNumber = bc.getCurrBlockNumber(); let newOwner = await this.getOwner(); + if (oldOwner == newOwner) { await this.updateConfirmed(newOwner, oldBlockNumber); if (oldTryCount == this.tryCount) { @@ -81,7 +85,7 @@ class ExecConfirmOwner { async getNftDb(tokenId) { const {err, conn} = await app.getDbConn('MarketDb0'); if (err) { - throw 'db error:' + err; + return null; } try { const {err, row} = await conn.ormSelectOne( @@ -89,9 +93,6 @@ class ExecConfirmOwner { [ ['token_id', tokenId] ]); - if (err) { - throw 'db error:' + err; - } return row; } finally { conn.release() @@ -100,7 +101,7 @@ class ExecConfirmOwner { async getOwner() { const instanceName = this.getInstanceName(); - //log.info('getOwner:' + instanceName + ' tryCount:' + this.tryCount); + log.info('getOwner:' + instanceName + ' tryCount:' + this.tryCount); while (true) { await bc.lockQuery(); try { @@ -111,7 +112,7 @@ class ExecConfirmOwner { if (reason == 'ERC721: owner query for nonexistent token') { return ''; } - console.log(err); + log.error(err); } finally { await bc.unlockQuery(); } @@ -122,20 +123,26 @@ class ExecConfirmOwner { async updateConfirmed(newOwner, blockNumber) { const {err, conn} = await app.getDbConn('MarketDb0'); if (err) { - throw 'db error:' + err; + return; } try { - const {err} = await conn.update( - 't_nft', - [ - ['token_id', this.tokenId] - ], - [ - ['owner_address', bcutils.toNormalAddress(newOwner)], - ['confirm_block_number', blockNumber] - ]); - if (err) { - throw 'db error:' + err; + { + const {err} = await conn.update( + 't_nft', + [ + ['token_id', this.tokenId] + ], + [ + ['owner_address', bcutils.toNormalAddress(newOwner)], + ['confirm_block_number', blockNumber] + ]); + } + { + await conn.execScript( + 'UPDATE t_nft_transfer SET `owner_confirmed` = 1 WHERE block_number < ?', + [ + blockNumber + ]); } } finally { conn.release()