带有支付表单的Firestore安全规则



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

这会导致一个安全问题,因为如果我允许用户在我的firebase安全规则中写入奖券集合,他可以创建自己的奖券而无需付费。

我需要门票被添加到数据库只有当付款已成功。

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

我的项目是在react/typescript。

你说你在区块链上进行支付,我假设你使用坚实性作为你的智能合约语言?

  1. 你为什么不在你的智能合约中发出一个事件呢?
  2. 然后在(单独的)服务器上监听这些事件。
  3. 更新你的(firebase)数据库。

(未测试)示例代码:

如何在固体中发射事件?(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' }
);

现在遍历这些事件并将它们放入数据库中。你也可以设置一个订阅,当一个新的块被创建时,它会通知你,这样你就可以检查当前块中是否有新的事件。

如果你将第一个区块链事件添加到firebaserealtime 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插件,便于集成。(但我从未尝试过)。然而,在我看来,使用区块链来处理支付将是最干净的解决方案。(+你没有手续费条纹使用)。

我希望我能给你一些好的线索!Firebase绝对适合这个

最新更新