在服务器端(NodeJS)使用其他人签名者与以太坊智能合约集成

Integrate with Ethereum smart contract using other person Signer on server-side (NodeJS)

我正在建立一个销售 NFT 的网站。我看到让访问者为 NFT 项目付款的方法是在 客户端 上与智能合约集成,以便从他们的钱包(例如 Metamask)中获取 Signer。

我的客户代码:

export async function createItemToken(itemPrice: number): Promise<string> {
  const web3Modal = new Web3Modal();
  const connection = await web3Modal.connect();
  const provider = new ethers.providers.Web3Provider(connection);
  const signer = provider.getSigner();

  const contract = new ethers.Contract(
    contractAddress,
    MyNFTContract.abi,
    signer,
  );

  const formatedItemPrice = ethers.utils.parseUnits(String(itemPrice), 'ether');
  const transaction = await contract.transferToken(
    {value: itemPrice},
  );

  const tx = await transaction.wait();
  return tx.transactionHash;
}

我知道访问者的钱包只能在客户端访问,但让客户端调用智能合约是没有意义的。例如,访问者可以为商品输入不同的价格。

如何避免?有没有办法在服务器端 (NodeJS) 进行这种集成?

我找不到在服务器上获取访问者签名的方法,所以可能我的所有流程都不正确...感谢您的帮助!

the visitor can enter different price for the item

当然可以。但智能合约还应验证 value 是否为预期价格。如果不是,它应该恢复交易。

根据提供的代码和问题,我假设创建代币的价格仅存储在链外。您应该使用合约作为价格的真实来源,并在链上对其进行验证。

pragma solidity ^0.8;

contract MyNFTContract {
    function transferToken() external payable {
        require(msg.value == this.getPrice(), "Incorrect value");
        // ... 
    }

    function getPrice() external pure returns (uint256) {
        // can by also dynamic based on the token ID or any other on-chain param
        return 0.5 ether;
    }
}