簡體   English   中英

如何通過使用 web3j 的交易獲得合同?

[英]How to get a contract by a transaction uising web3j?

我需要檢查交易是否是 ERC721/ERC1155 交易並獲取接收地址、代幣地址、價值等信息。如果我理解正確,我必須為交易加載合約並檢查它是否繼承 ERC165 以便確認它是 ERC721/ERC1155 交易。

問題:我不明白如何獲得具有交易對象的合同。 我也沒有找到獲取令牌地址的方法。

我在 Infura 上有一個以太坊節點,我從那里讀取塊並迭代事務。 我收到一筆交易及其收據。 我的代碼如下所示:

var tr = web3j.ethGetTransactionByBlockNumberAndIndex(blockIdParam, transactionIndex).sendAsync().get();
var hash = tr.getTransaction().get().getHash();
var receipt = web3.ethGetTransactionReceipt(hash).send().getTransactionReceipt();

現在我的工作方向是閱讀事務日志,檢查它們的主題並驗證它們是否包含Transfer事件。 但是轉賬事件也是由 ERC20 交易發出的,所以我在這里有點困惑。

檢查Transfer()事件日志的方向是正確的。 盡管ERC20ERC721都使用相同的事件簽名,但 ERC721 (NFT) 標准將第三個主題(令牌 ID)定義為indexed ,它將其值存儲在索引主題集中。 而 ERC20 將第 3 個主題(數量)定義為非索引,使索引主題的總長度設置為 2。

我選擇了一個包含 ERC20 和 ERC721 傳輸事件日志的隨機事務 看起來它背后的邏輯是以 ERC20 代幣的形式支付來鑄造一個新的 ERC721 代幣。

注意:我不是 Java 開發人員,因此我將在回答中使用 JS 代碼,希望您可以將其用作參考,以便在 Web3 庫的 Java 實現中找到正確的語法和方法。

const Web3 = require("web3");
const web3 = new Web3("<provider_url>");

// keccak256 of string "Transfer(address,address,uint256)"
const TRANSFER_SIGNATURE = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";

async function run() {
    const txHash = "0xfb4dc20b4a8d0b72442a396aced0fc537de757c6aac69609ab3d09d19f9c9aa8";
    const txReceipt = await web3.eth.getTransactionReceipt(txHash);

    for (let log of txReceipt.logs) {
        if (_isERC20Log(log)) {
            // Unindexed topics are concatenated in the `data` field.
            // There's only one unindexed topic in this case,
            // so you don't need to do any parsing and just use the whole value.
            const amount = web3.utils.hexToNumberString(log.data);
            console.log("ERC20 token amount: ", amount);
            console.log("ERC20 token contract: ", log.address);
        } else if (_isERC721Log(log)) {
            // 3rd indexed topic
            // index 0 of the array is the event signature, see `_isERC721Log()`
            const tokenId = web3.utils.hexToNumberString(log.topics[3]);
            console.log("ERC721 token ID: ", tokenId);
            console.log("ERC721 token contract: ", log.address);
        }
    }
}

function _isERC20Log(log) {
    return (
        log.topics[0] == TRANSFER_SIGNATURE
        && log.topics.length == 3 // index 0 is the signature, and then 2 indexed topics
    );
}

function _isERC721Log(log) {
    return (
        log.topics[0] == TRANSFER_SIGNATURE
        && log.topics.length == 4 // index 0 is the signature, and then 3 indexed topics
    );
}

run();

輸出:

ERC20 token amount:  40000000000000000000
ERC20 token contract:  0x54a7cee7B02976ACE1bdd4aFad87273251Ed34Cf
ERC721 token ID:  12013
ERC721 token contract:  0x41cB4a771FdD019ADBF4685bd4885fbBeedE1784

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM