Web3JS 发送事务

Posted

技术标签:

【中文标题】Web3JS 发送事务【英文标题】:Web3JS Send Transaction 【发布时间】:2021-09-20 06:58:37 【问题描述】:

我是 Web3 和 Solidity 开发的新手。尝试开发我的第一个 DAPP 只是为了更多地了解这个世界。我正在使用元掩码,并且在浏览器中也没有出现错误。我正在执行发送事务,结果没有在控制台中弹出,但也没有错误。请帮助我改进我的代码并引导我朝着正确的方向前进。

const web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");

async function requestWeb3() 
    await window.ethereum.request( method: "eth_requestAccounts" );


requestWeb3();

let account;

const contractABI = [
    
        "inputs": [],
        "name": "buyAd",
        "outputs": [],
        "stateMutability": "payable",
        "type": "function"
    ,
    
        "inputs": [],
        "name": "lastPrice",
        "outputs": [
            
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            
        ],
        "stateMutability": "view",
        "type": "function"
    
]

const contractAddress = "0x933ef849cca1c037c5b335ce5ea1c309a6de6d67";

const contract = new web3.eth.Contract(contractABI, contractAddress);

web3.eth.getAccounts().then(accounts => 
    console.log(accounts[0]);
    accounts = accounts;
)


const connectBtn = document.getElementById("connect");

connectBtn.addEventListener('click', () => 
    console.log('click');
    contract.methods.buyAd().send(
        from:accounts[0],
        to:contractAddress,
        value:  "1000000000000000000", 
        data: "0xdf"
        , function (err, result) 
            if (err) 
                console.log("Error!", err);
                return
            
            console.log(result);
        
    )
);
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


contract AdvertisementAuction 
    
    uint public lastPrice = 0;
    
    function buyAd() payable public 
        require(msg.value > lastPrice, "This advertisement costs more then the inputed value.");
        lastPrice = msg.value;
    
    

【问题讨论】:

【参考方案1】:

试试这个脚本:

const Web3 = require("web3");
const ethEnabled = async () => 
  if (window.ethereum) 
    await window.ethereum.send('eth_requestAccounts');
    window.web3 = new Web3(window.ethereum);
    return true;
  
  return false;

我们检查window.ethereum 是否存在,然后使用我们自己的web3 版本创建一个window.web3 对象,使用window.ethereum 对象作为输入提供者。 在这种情况下,await window.ethereum.send('eth_requestAccounts') 函数会调用弹出 UI 对话框,询问用户是否允许将 dApp 连接到 MetaMask。

它应该可以工作。让我知道:)

【讨论】:

以上是关于Web3JS 发送事务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 web3js 中进行多笔交易

使用 web3js 从事务哈希中获取令牌传输详细信息

重复事务挂起 - web3js,本地 geth

如何将一组结构从 web3js 发送到 Solidity 合约?

web3js eth vs 帐户 vs 个人

通过 web3js 向 Metamask 发送多行签名