在服务器端(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;
}
}
我正在建立一个销售 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;
}
}