20 后续:关于链上矿工打包逻辑,出现一些意料之外的问题

原问题连接:点这里 上面的回答都不太是我想要的,所以做一个代码做为演示来提问

开始上代码

当前场景在BSC测试网上,账户拥有余额0.8+BNB

首先写一个打印账户信息的函数,命名为getInfo

async function getInfo() {
  let nonce = await wallet.getTransactionCount();
  let balance = await wallet.getBalance();
  console.log("===================");
  console.log(`balance:${balance.toString()}   nonce:${nonce}`);
  console.log("===================");
}

再写一个对其他账户转账5次,每次1个bnb的函数, 这样是转账不出去,会报错的,所以用trycatch包裹起来

async function transfer_error() {
  let nonce = await wallet.getTransactionCount();
  //给一个账号转账5次
  for (let a = 0; a < 5; a++) {
    console.log(`发起错误的转账,本次nonce是${nonce},这是第${a}笔`);
    try {
      await wallet.sendTransaction({
        to: address,
        value: ethers.utils.parseEther("1"),
        nonce: nonce++,
      });
    } catch (error) {}
  }
}

开始执行业务, 1.先打印账户信息 2.进行错误的转账5次,转账完毕后,等待20秒,在进行一次正确的转账 3.正确转账,正确的转账就是给账户转账1wei, 4.正确转账完成后等待20秒,让信息被确认,再打印出账户的信息。 代码如下

mian();
async function mian() {
  //打印账号信息
  await getInfo();
  //发起错误的转账
  transfer_error().then(() => {
    console.log("五次错误转账已经完成,20秒后发起一笔正确转账");
    //发起完成后,给个20秒等待,再发起正确的转账
    setTimeout(() => {
      wallet
        .sendTransaction({
          to: address,
          value: 3,
        })
        .then(() => {
          console.log("发起正确转账完毕,二十秒后查询账户信息");
          //发起正确的转账后,
          //给个20秒时间,链上确认后打印下账户信息
          setTimeout(() => {
            getInfo();
          }, 20 * 1000);
        });
    }, 20 * 1000);
  });
}

当这段代码执行完毕后,得到的信息是这样的。image.png

从这上面看,我的账户下一笔交易时,nonce应该是217

在我刚刚执行transfer_error的时候,发送了包含nonce为216,217,218,219,220 的交易信息到链上。

我的问题是,矿工能不能把我的217,218,219,220签名信息保存下来。 然后过了个好几天,我的账户也没用再做其他的交易,但是别人给我的账户转账了1个BNB, 矿工在这个时候拿出217的信息签名信息,在链上把我的交易给确认了,从而我的账户得到了1个BNB,下一刻又转账走了1个BNB

请先 登录 后评论

最佳答案 2022-06-06 23:15

我们来捋一下整个流程 假设地址余额为0 1、构造5次交易 nonce=(216,217,218,219,220) 丢入mempool 2、矿工从mempool取216验证发现余额不足丢弃216 因为正确的216一直没出现 所以不会验证后续nonce 此时217/218/219/220还在mempool里面 3、此时地址收到bnb 发送一笔交易 该交易可以被确认 即正确的216出现了 4、矿工开始验证后续的nonce 217 5、如果此时账户余额够 那么在mempool里面的217…220交易都会验证通过 直到余额不足

请先 登录 后评论

其它 0 个回答