带有付款表的 Firestore 安全规则
Firestore Security rules with payment form
我正在创建一个抽奖网站。用户连接他的钱包并支付抽奖券。区块链交易确认后,我将他的抽奖券添加到firestore的一个集合中。
这会导致安全问题,因为如果我允许用户在我的 firebase 安全规则中写入抽奖券集合,他可以在不支付的情况下创建自己的抽奖券。
只有在付款成功后,我才需要将门票添加到数据库中。
不知道有支付方式的网站是怎么做的。也许 firebase 不是一个好的解决方案?
我的项目在 react/typescript.
你说你通过区块链进行支付,我假设你使用 solidity 作为你的智能合约语言?
- 你为什么不 emit an event in your smart contract?
- 然后您 listen for these events 在(单独的)服务器上。
- 只要有事件发出,就会更新您的 (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 应该绝对适合这个。
我正在创建一个抽奖网站。用户连接他的钱包并支付抽奖券。区块链交易确认后,我将他的抽奖券添加到firestore的一个集合中。
这会导致安全问题,因为如果我允许用户在我的 firebase 安全规则中写入抽奖券集合,他可以在不支付的情况下创建自己的抽奖券。
只有在付款成功后,我才需要将门票添加到数据库中。
不知道有支付方式的网站是怎么做的。也许 firebase 不是一个好的解决方案?
我的项目在 react/typescript.
你说你通过区块链进行支付,我假设你使用 solidity 作为你的智能合约语言?
- 你为什么不 emit an event in your smart contract?
- 然后您 listen for these events 在(单独的)服务器上。
- 只要有事件发出,就会更新您的 (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 应该绝对适合这个。