带有付款表的 Firestore 安全规则

Firestore Security rules with payment form

我正在创建一个抽奖网站。用户连接他的钱包并支付抽奖券。区块链交易确认后,我将他的抽奖券添加到firestore的一个集合中。

这会导致安全问题,因为如果我允许用​​户在我的 firebase 安全规则中写入抽奖券集合,他可以在不支付的情况下创建自己的抽奖券。

只有在付款成功后,我才需要将门票添加到数据库中。

不知道有支付方式的网站是怎么做的。也许 firebase 不是一个好的解决方案?

我的项目在 react/typescript.

你说你通过区块链进行支付,我假设你使用 solidity 作为你的智能合约语言?

  1. 你为什么不 emit an event in your smart contract
  2. 然后您 listen for these events 在(单独的)服务器上。
  3. 只要有事件发出,就会更新您的 (firebase) 数据库。

(未测试)示例代码:

如何在 solidity 中发出事件? (raffle.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Raffle {
    event PaymentCompletion(address buyer, uint256 amountOfTickets);

    function buyTickets() external payable {
        emit PaymentCompletion(msg.sender, msg.value)
    }
}

你是怎么收听这些事件的? 使用 web3js 时:

const contract = new web3.eth.Contract(CONTRACT_ABI, CONTRACT_ADDRESS);
const lastBlock = await web3.eth.getBlockNumber()

// paymentEvents is an array containing the payments of the last 500 blocks.
const paymentEvents = await contract.getPastEvents(
    'PaymentCompletion', // change if your looking for a different event
    { fromBlock: latestBlock - 500, toBlock: 'latest' }
);

现在遍历这些事件并将它们放入您的数据库中。您还可以 set up a subscription 它会在新块创建时通知您,因此您可以检查当前块内是否有新事件。

如果您将第一个区块链事件添加到 firebase realtime database

,这就是它的样子
var db = admin.database();
var ref = db.ref("/payments");

// ...

ref.child("path/to/transaction").set({
    buyer: paymentEvents[0].buyer,
    amountOfTickets: paymentEvents[0].amountOfTickets,
    // put the rest of your data here
}, (err) => {
    if (err) {
        console.error(err)
    }
})

或者(如果你不想在区块链上处理支付)你也可以看看stripe,它还有一个易于集成的 firebase 插件。 (但我从未尝试过)。然而,imo 使用区块链来处理支付将是最干净的解决方案。 (+ 你没有条纹使用的手续费)。

希望能给大家一些好的线索! Firebase 应该绝对适合这个。