簡體   English   中英

帶有付款表單的 Firestore 安全規則

[英]Firestore Security rules with payment form

我正在創建一個抽獎網站。 用戶連接他的錢包並支付抽獎券。 區塊鏈交易確認后,我將他的抽獎券添加到 firestore 的收藏中。

這會導致安全問題,因為如果我允許用​​戶在我的 firebase 安全規則中寫入抽獎券集合,他可以創建自己的彩票而無需付費。

僅當付款成功后,我才需要將門票添加到數據庫中。

我不知道有支付方式的網站是如何做到的。 也許firebase不是一個好的解決方案?

我的項目在反應/打字稿中。

你說你通過區塊鏈進行支付,我假設你使用solidity作為你的智能合約語言?

  1. 為什么不在智能合約中發出事件
  2. 然后,您在(單獨的)服務器上偵聽這些事件
  3. 每當發出事件時,它都會更新您的( firebase )數據庫。

(未經測試)示例代碼:

你如何在solidity中發出事件? (抽獎.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' }
);

現在遍歷這些事件並將它們放入您的數據庫中。 您還可以設置訂閱,在創建新塊時通知您,這樣您就可以檢查新事件是否在當前塊內。

如果您將第一個區塊鏈事件添加到 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 應該絕對適合這個。

暫無
暫無

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

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