可以仅使用 Metamask 调用 Solidity 合约方法吗?

Can you call a Solidity contract method with only Metamask?

我想在我的应用程序中使用 Metamask 让用户支付固定的 ETH 费用(加上 gas)来调用我的 Solidity 合约中的方法。我查看了 Metamask 文档,eth_sendTransaction 方法似乎接近我所需要的; eth_sendTransaction 当然允许我向用户请求 ETH,但是“数据”参数有点混乱。

Metamask 文档说:

data is optional, but used for defining smart contract creation and interaction

also used for specifying contract methods and their parameters.

所以“数据”代表我的方法及其参数,但是 Metamask(或 window.ethereum,更确切地说)如何知道我试图调用其方法的合约?

您通常不需要提供合约地址和 ABI/JSON 才能与部署的合约进行交互吗?简而言之,是否可以单独使用 Metamask 来完成我所描述的事情?或者您是否必须进行其他客户端设置才能使用 eth_sendTransaction?

调用方法

编辑:顺便提一下,TylerH,答案涉及使用 web3.js。也许不要编辑别人的帖子,除非你知道你到底在说什么。只是一个想法...

是的,您需要合同 abi 才能获得您需要包含在传递给合同的数据中的信息。您还需要完成其他一些事情:

首先,您需要确保将 ethers.js@alch/alchemy-web3 npm 库下载到您的应用程序中。其次,您需要来自 Alchemy 等平台的提供商 API 密钥,以便与合同 abi 进行通信。最后,您需要合约 abi,​​它可以在 etherscan 合约部分的底部找到。网上有很多关于如何获取这些东西的信息,所以我不会在这里讨论如何配置它们。

一旦你有了这些,你就可以进行下一步了。

我建议在您的应用程序文件系统中某处的实用程序文件中创建它,但我的想法是:

const alchemyKey = process.env.ALCHEMY_KEY;
const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(alchemyKey);
const contractABI = require('../contract-abi.json');
export const contract = new web3.eth.Contract(contractABI, CONTRACT_ADDRESS);

export const yourMethod = () => {
 if(window.ethereum.request({method: 'eth_requestAccounts'})){
  const provider = new ethers.providers.Web3Provider(window.ethereum);
  const signer = provider.getSigner();
  const address = await signer.getAddress();

  const tx = {
   from: address,
   to: CONTRACT_ADDRESS,
   value: "some wei value", // this is the value in wei to send
   data: contract.methods.YOUR_CONTRACT_METHOD_HERE().encodeABI()
  }

  const txHash = await window.ethereum.request({
   method: 'eth_sendTransaction',
   params: [tx]
  });

  // do something with your transaction hash here
  console.log({txHash});
 }else{
   console.log('user must connect wallet');
 }
}

所以在我们交易的数据字段中填充的值来自调用我们试图在我们的合约中调用的方法。这是经过编码的,然后我们将此信息与其余交易数据一起传递。

这是对它的作用的非常简短的描述,我希望这就是您要找的。如果您需要更多帮助,我随时可以在 Twitter @_syndk8 上聊天。