内部数据库和Solidity之间的数据重复

时间:2018-02-05 01:01:06

标签: ethereum truffle web3js

我希望在我的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。

1 个答案:

答案 0 :(得分:0)

  

在主网上,我需要多长时间才能获得交易收据?使用加载轮单击onBuy按钮直到收据到达后,让用户在同一页面上等待是否合理?如果没有,那么处理这个问题的常规方法是什么?

当您发送交易时,您将很快获得交易哈希。但是,只有在挖掘交易后才会返回收据。开采交易所需的时间长短取决于您愿意为天然气支付多少费用(对于非常高的天然气价格可能需要几秒钟,如果您需要支付,则可能需要几个小时) ; 10 Gwei)。您可以使用Ropsten / Rinkeby获得一个想法(测试网络可能比MainNet更快)。机会是(并且基于您所描述的系统),让您的用户等待是不合理的。

我不知道是否有传统的"处理这个问题的方法。您可以向用户提供您自己的确认号码(或使用交易哈希值作为确认号码),在交易开始时发送电子邮件,在移动应用程序上推送通知等。如果您向用户提供某种类型基于事务哈希的确认号,您必须决定在事务失败时如何解决案例。

  

我的数据库结构是否是连接区块链的合理方式?我担心数据完整性(即必须在我的内部数据库和区块链之间同步地址字段),但我发现将区块链数据存储在内部数据库中很有用,并且主要从内部数据库而不是区块链中读取。

这纯粹是一种观点,所以请稍等一下。我尽量避免重复数据,但如果您要拥有多个持久层,则可能需要在它们之间保持某种引用完整性。因此,存储ID和地址当然可以。

您的问题部分让我感到困惑的是您为什么更喜欢从数据库中阅读?您是否尝试过测量服务器上使用完全同步节点的延迟,并通过constant函数从合同中检索数据?在复制我的数据之前,我会先测试一下。在您的情况下,我会使用区块链来存储购买,同时使用数据库进行库存管理。但是,这基于对您的商业案例知之甚少。