Web3js: Как отображать незавершенные транзакции в пользовательском блокчейне

#express #blockchain #web3js

Вопрос:

Я работал над пользовательской локальной тестовой сетью блокчейна и хочу показывать незавершенные транзакции в проводнике пользовательских блоков. Поэтому всякий раз, когда поступает запрос GET от интерфейса, api-сервер(Express) должен отвечать ожидающими транзакциями. Сначала я попробовал web3.eth getPendingTransactions использовать метод s, но он всегда возвращался с пустым массивом.

Затем я попробовал web3.eth.subscribe 'pendingTransactions' использовать опцию «s», как в документах.

Ниже приведен код, который я пробовал.

transactionController.js

 const Web3 = require("web3");
const web3 = new Web3("ws://192.168.112.82:7001");
var pndTxns = [];

exports.pendingTransactions = (req, res) => {
web3.eth
      .subscribe("pendingTransactions", function (error, result) {
        if (!error) console.log(result);
        console.log(pndTxns);
      })
      .on("data", function (transaction) {
        pndTxns.push(transaction);
}

res.status(200).json({
  success: true,
  txns: pndTxns,
});

 

(Здесь, transactionController.js контроллер для маршрутизатора ожидающих транзакций.)
Но pndTxns в ответ всегда возвращается с пустым арраром, даже если pndTxns web3.eth.subscribe он существует.

Я думаю, это связано с тем, что web3.eth.subscribe фактически создает соединение веб-сокета с узлом RPC, чтобы pndTxns не мог выйти за рамки этого метода.

Наконец, я попробовал использовать etherjs модуль, подобный этому блогу, и ниже приведен код.

 var ethers = require("ethers");
var url = "ws://192.168.112.82:7001";

var init = function () {
  var customWsProvider = new ethers.providers.WebSocketProvider(url);
  
  customWsProvider.on("pending", (tx) => {
    customWsProvider.getTransaction(tx).then(function (transaction) {
      console.log(transaction);
    });
  });

  customWsProvider._websocket.on("error", async () => {
    console.log(`Unable to connect to ${ep.subdomain} retrying in 3s...`);
    setTimeout(init, 3000);
  });
  customWsProvider._websocket.on("close", async (code) => {
    console.log(
      `Connection lost with code ${code}! Attempting reconnect in 3s...`
    );
    customWsProvider._websocket.terminate();
    setTimeout(init, 3000);
  });
};

init();

res.status(200).json({
  success: true,
  txns: pndTxns,
});
 

Also I could see pending transactions inside init() function but could not send those transactions with a reponse.

Here is sample output of transaction inside init function.

 [
  {
    hash: '0x4c34186e0e6fee5c83406660cf8ef830c36548bb3b8cc14a0fb1eb29fe438331',
    type: 0,
    accessList: null,
    blockHash: '0x000000c9000004c2e8c3585c051b49972b1de6a64c40ce7310a2a994b00483e4',
    blockNumber: 40964,
    transactionIndex: 0,
    confirmations: 1,
    from: '0x8734CB972d36a740Cc983d5515e160C373A4a016',
    gasPrice: BigNumber { _hex: '0x3b9aca00', _isBigNumber: true },
    gasLimit: BigNumber { _hex: '0x5208', _isBigNumber: true },
    to: '0x9651819cfa16c8F3Ba927d5350Ca25417591166B',
    value: BigNumber { _hex: '0x01236efcbcbb340000', _isBigNumber: true },
    nonce: 224,
    data: '0x',
    r: '0xed3d1d5b94a413ce45a06de77851865281cc41c8cdbbcbc4b96356b4d9e49e5c',
    s: '0x2d05d609590c1d5ff7e3ff69111cc6d3caf6f517c2e0229a10de8e938ccee1ba',
    v: 535,
    creates: null,
    chainId: 250,
    wait: [Function (anonymous)]
  }
]
 

I don’t care whatever way you use but can you tell me how can I response pending transactions?