簡體   English   中英

在服務器端(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)進行這種集成?

我找不到在服務器上獲取訪問者簽名者的方法,所以也許我的所有流程都不正確......感謝您的幫助!

訪問者可以為商品輸入不同的價格

他們當然可以。 但智能合約還應驗證該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;
    }
}

暫無
暫無

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

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