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

Posted

技术标签:

【中文标题】内部数据库和 Solidity 之间的数据重复【英文标题】:Data duplication between internal database and Solidity 【发布时间】:2018-07-14 20:06:36 【问题描述】:

我想在我的 dapp 中实现一个流程,我希望能得到一些意见。

流程:

用户看到一个产品列表并选择一个购买它。用户的元掩码已解锁并且有足够的余额。

设置:

Rails 后端,React 前端,ganache-cli,truffle,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 字段),但我发现将区块链数据存储在内部数据库中很有用,并且主要从内部数据库而不是区块链读取。

【问题讨论】:

【参考方案1】:

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

当您发送交易时,您会很快获得交易哈希。但是,只有在交易被挖掘后才会返回收据。挖掘交易所需的时间长度因您愿意为 gas 支付多少而有很大差异(对于非常高的 gas 价格可能需要几秒钟,如果您支付

我不知道是否有“常规”方法来处理这个问题。您可以向用户提供您自己的确认号(或使用交易哈希作为确认号),在交易被挖掘时发送电子邮件,在移动应用程序上推送通知等。如果您向用户提供某种类型基于交易哈希的确认号,您必须决定在交易失败时如何解决问题。

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

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

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

【讨论】:

以上是关于内部数据库和 Solidity 之间的数据重复的主要内容,如果未能解决你的问题,请参考以下文章

智能合约从入门到精通:Solidity的特性与内部机制

智能合约从入门到精通:Solidity的特性与内部机制

深入solidity内部 -以太坊EVN插槽存储关系

智能合约从入门到精通:调用数据的布局和ABI

SQL'WHERE'与'ON'(内部连接)[重复]

C ++模板内部[重复]