我希望在我的dapp中实现一个流程,我希望得到一些意见。
流速:
用户会看到一个产品列表并选择一个来购买它。用户已将元掩码解锁并且具有足够的平衡。
设定:
后端的Rails,前端的React,ganache-cli,松露,metamask(web3js)。
数据库结构:
在应用程序的内部PostgresDB中,有一个products
表。在区块链中,有一个动态数组products
,如下所示:
内部Postgres:
products
name
price
owner_id
owners
name
id
address
区块链(合同存储)
Product[] products
struct Product {
name
}
mapping(uint => address) public productIdToOwner;
mapping(uint => uint) public productIdToPrice;
当用户点击"购买此产品"时,会运行以下功能onBuy
按钮:
onBuy = (product) => {
const { id, external_id, name, price, meta } = product
this.ContractInstance.methods.buy(external_id).send({
from: this.state.currentUserAddress,
gas: GAS_LIMIT,
value: web3.utils.toWei(price.toString(), "ether"),
}).then((receipt) => {
// What to do before getting a receipt?
console.log(receipt)
}).catch((err) => {
console.log(err.message)
})
}
问题:
在主网上,我需要多长时间才能获得交易收据?使用加载轮点击onBuy
按钮直到收据到达后,让用户在同一页面上等待是否明智?如果没有,那么传统的解决方法是什么?
我的数据库结构是否是连接区块链的合理方式?我担心数据完整性(即必须在我的内部数据库和区块链之间同步address
字段)但我发现将区块链数据存储在内部数据库中很有用,并且主要从内部数据库读取而不是blockchain。
答案 0 :(得分:0)
在主网上,我需要多长时间才能获得交易收据?使用加载轮单击onBuy按钮直到收据到达后,让用户在同一页面上等待是否合理?如果没有,那么处理这个问题的常规方法是什么?
当您发送交易时,您将很快获得交易哈希。但是,只有在挖掘交易后才会返回收据。开采交易所需的时间长短取决于您愿意为天然气支付多少费用(对于非常高的天然气价格可能需要几秒钟,如果您需要支付,则可能需要几个小时) ; 10 Gwei)。您可以使用Ropsten / Rinkeby获得一个想法(测试网络可能比MainNet更快)。机会是(并且基于您所描述的系统),让您的用户等待是不合理的。
我不知道是否有传统的"处理这个问题的方法。您可以向用户提供您自己的确认号码(或使用交易哈希值作为确认号码),在交易开始时发送电子邮件,在移动应用程序上推送通知等。如果您向用户提供某种类型基于事务哈希的确认号,您必须决定在事务失败时如何解决案例。
我的数据库结构是否是连接区块链的合理方式?我担心数据完整性(即必须在我的内部数据库和区块链之间同步地址字段),但我发现将区块链数据存储在内部数据库中很有用,并且主要从内部数据库而不是区块链中读取。
这纯粹是一种观点,所以请稍等一下。我尽量避免重复数据,但如果您要拥有多个持久层,则可能需要在它们之间保持某种引用完整性。因此,存储ID和地址当然可以。
您的问题部分让我感到困惑的是您为什么更喜欢从数据库中阅读?您是否尝试过测量服务器上使用完全同步节点的延迟,并通过constant
函数从合同中检索数据?在复制我的数据之前,我会先测试一下。在您的情况下,我会使用区块链来存储购买,同时使用数据库进行库存管理。但是,这基于对您的商业案例知之甚少。