【问题标题】:transactions and logs order事务和日志顺序
【发布时间】:2021-09-13 16:13:52
【问题描述】:

我正在构建一个区块链游戏,为了加快速度,我还在构建一个 Web 应用程序,以便用户从那里读取数据。

所以起初,我想听事件并将它们的数据保存在我的数据库中,但后来我读到事件的顺序不能保证,然后我想也许你使用 transactionIndexlogIndex 对它们进行排序,然后将数据放入数据库,但后来我读到顺序也可以更改。

有没有办法按照它们在区块上开采的顺序来获取事件?数据的时间线很重要,我不能把它和旧事件混在一起

【问题讨论】:

  • “我读到不能保证事件的顺序”是什么意思。您可以按 tx 块号对其进行排序
  • @AhmadGorji 在它自己的块中。每笔交易在区块中都有索引,事件也是如此
  • 所以你也想要区块中的 tx 索引?!
  • @AhmadGorji 我想按照它们在区块中发生的顺序获取所有事件,首先获取交易顺序,然后对于每笔交易,她的事件按照发生的顺序进行

标签: solidity web3


【解决方案1】:

我真的不知道后端和数据库,但我想这可能会对你有所帮助。 (我使用的是纯 JavaScript,我使用的是 Rinkeby 测试网络,因此地址来自该区块链)。

JavaScript 中的代码:

const IERC20 = ['function decimals() external view returns (uint8)',
    'function balanceOf(address account) external view returns (uint256)',
    'function allowance(address owner, address spender) external view returns (uint256)',
    'function approve(address spender, uint256 amount) external returns (bool)',
    'event Transfer(address indexed from, address indexed to, uint256 value)',
    'event Approval(address indexed owner, address indexed spender, uint256 value)'
]

const USDCAddress = "0x4DBCdF9B62e891a7cec5A2568C3F4FAF9E8Abe2b";
const YOUR_CONTRACT_ADDRESS = YOUR_CONTRACT_ADDRESS;

let provider;
let signer;
let signerAddress;
let YOUR_CONTRACT;
let USDCContract;
let eventTest;

const startFunction = async () => {
    //Connect to metamask
    await ethereum.request({ method: 'eth_requestAccounts'});
    //Change network to Rinkeby
    await ethereum.request({ method: 'wallet_switchEthereumChain', params:[{chainId: '0x4'}]});
    //Get the provider
    provider = new _ethers.providers.Web3Provider(window.ethereum);
    //Get signer
    signer = provider.getSigner();
    //Get signer address
    signerAddress = await signer.getAddress();
    //If you use provider instead of signer in function below, you just can't interact with contract.
    USDCContract = await new ethers.Contract(USDCAddress, IERC20, signer);
    USDCContract.on("Approval", (from, to, amount, event) => {
        if (to == contractaddress && from == signerAddress){
            eventTest = event;
            //In console of browser try eventTest and see what it contains and what you look for
           //I think you want these informations:
           event['logIndex'];
           event["blockNumber"];
           await event.getTransactionReceipt(); //This returns transaction of the event
        }
    });
}
startFunction();

async function approve(){
    USDCContract.approve(contractaddress, BigInt("9007199254740990")**3n);
}

//call approve() in browser console and confirm the transaction.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2021-09-13
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多