繁体   English   中英

使用 Ethers.js 检索 Solidity 事件数据

[英]Retrieving Solidity Event Data with Ethers.js

我是 Solidity 和 Ethers.js 的新手,所以如果有任何业余错误,那就是原因。

我正在尝试构建一个 dApp,它在我的智能合约上运行一个函数,检索事件发出的数据,然后将其显示在我的前端。 到目前为止,我已经让它在 Localhost 上运行。 目前,MetaMask 连接到我的前端,但当我尝试用合约确认交易时它会抛出错误。

创建函数(JS):

    async function create() {
        ///Acquiring values
        postBody = document.getElementById("in-1-pbd").value;
        postSubcat = document.getElementById("in-2-sc").value;
        console.log(postBody + ", " + postSubcat);
        ///Connecting with Ethereum
        await requestAccount()
        if (typeof window.ethereum != 'undefined') {
          const provider = new ethers.providers.Web3Provider(window.ethereum);
          const signer = provider.getSigner();
          const contract = new ethers.Contract(blokracyAddress, Blokracy.abi, signer)
          const transaction = await contract.createBallot(postSubcat, postBody)
          await transaction.wait()
        ///Building and presenting the ballot
        contract.on("Creation", (message, idnum ) => {
          console.log("Creation Event Data: ", message, idnum);
          buildBallot(Wallet.publicKey, idnum, postBody);
          });
        } else {
          window.alert("Non-Ethereum browser detected. You should consider installing MetaMask.")
        }
      }

请求帐户功能:

      async function requestAccount() {
        await window.ethereum.request({ method: 'eth_requestAccounts' });
      }

创建函数(稳固性):

///Event Declaration
    event Creation(string message, uint idnum);
///Functionality
///Creating a Ballot:
    function createBallot(
        string memory _subcategory, string memory _post
    ) public {

        ///Set Operator
        operator = msg.sender;

        ///Increment ballotNum
        ballotNum ++;

        ///Apply specifics to ballot
        ballot[ballotNum] = Ballot(
            ballotNum, _subcategory, operator,
            _post, 0, 0, 0, 0
        );

        ///return string and ballotNum
        emit Creation("Ballot was successfully posted!", ballotNum);
        
    }

任何见解都会令人惊叹。 就像我说的,我是新手,正在尝试通过构建这个项目尽可能多地了解 dApp。

您可以尝试这种方法在 web3 的帮助下在前端调用智能合约的 function。

const web3 = new Web3(sNetworkRPCURL);
const oDefaultWeb3 = new Web3(window.ethereum);
let oContractObject;
let sWalletAddress;

async function metamaskConnection(){
    const aReqAccount = await window.ethereum.request({
        method: "eth_requestAccounts",
    });
    sWalletAddress=aReqAccount[0];

}
async function create() {
        ///Acquiring values
        postBody = document.getElementById("in-1-pbd").value;
        postSubcat = document.getElementById("in-2-sc").value;
        console.log(postBody + ", " + postSubcat);
        ///Connecting with Ethereum

        if(typeof window.ethereum=="undefined"){
            console.log("METAMASK IS NOT FOUND");
            return;
        }

        oContractObject = new web3.eth.Contract(aContractABI,sContractAddress);
        let oNewContractObject = new oDefaultWeb3.eth.Contract(aContractABI,sContractAddress);

       
        let estimatedGas;      
    
        try {
            estimatedGas = await oNewContractObject.methods
                .createBallot(postSubcat, postBody)
                .estimateGas({
                    from: sWalletAddress                    
                });
    
            console.log("Estimated Gas: ", estimatedGas);
        } catch (error){          
    
            console.log(error);   
    
            return;
        }
        try {
            await oNewContractObject.methods
                .createBallot(postSubcat, postBody)
                .send({
                    from: sWalletAddress,                   
                    gas: estimatedGas,
                })
                .on("transactionHash", (txHash) => {
                    console.log("Transaction Hash: ", txHash);                    
                })
                .on("receipt", async (txReceipt) => {
                    console.log("Receipt: ", txReceipt);   
                   
                })
                .catch("error", (err) => {
                    console.error(err);
                    
                });
        } catch (err) {
            console.error(err);
           
        }
    }

我只想澄清我在代码中采用的 web3 object 和 oDefaultWeb3 对象。 拳头 web3 object 我将使用它来查看或调用()方法。 另一个对 send() 方法很有用。

所以,现在我希望这种方法对您开发 dApp 等有帮助。

你可以获得这样的事件:

const from = "some address"
const filter = uni.filters.Transfer(from)

const logs = await uni.queryFilter(filterFromAddress1orAddress2)

如果你想要所有的参数,包括非索引的,你需要创建一个接口并解析日志:

const interface = new ethers.Interface(ABI)

const parsedLogs = logs.map(log => {
    return interface.parseLog({ data: log.data, topics: log.topics });
})

您可以阅读本文以获取更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM