通过使用dapp的服务器地址签署数据来限制用户使用合同方式的互动

时间:2018-12-01 10:44:54

标签: solidity smartcontracts web3 web3js erc20

我有一个带有铸币功能的ERC20代币合同。

此功能应允许用户在网站上执行特定操作或活动后铸造令牌。 如果用户成功执行该操作,则他将能够使用mint功能发送交易并接收令牌。

我的工作流程和问题: 为了防止用户直接与合同进行交互并根据需要铸造任意数量的令牌,合同仅允许特定的eth地址来调用mint函数。如果操作成功执行,则将在服务器上设置该特定地址并签署交易。 但是,这意味着该地址也将需要支付汽油费。

当前,我正在考虑实施另一个合同,该合同将作为唯一可以调用ERC20合同上的mint功能的地址。 该新合同将接收来自用户的交易,该交易包含变量,字符串和由服务器地址签名和散列的随机数。新合同将能够解密数据并知道该交易确实已由服务器批准,并可以从令牌合同中调用mint函数。 这样,用户将无法直接尝试铸造令牌或一遍又一遍地重新发送交易以获取更多令牌。

我设想了以下可能的简单实现:

  1. 服务器对三项信息进行签名:用户的地址,要铸造的金额以及每笔交易要增加的整数(又名mintRequestId)-这种增加可以是随机的。
  2. 这三个哈希字符串传递给我的用户的客户端逻辑,并用作我的合同方法的参数,该方法提示发送:

    myContract.methods.Mint(signedAddresses,signedMintAmount,signedMintRequestId).send({from:userWallet})

  3. 在我的合同中,我使用服务器的钱包公钥和:

    A。比较msg.sender和signedAddresses。

    B。获取金额。

    C。确保mintRequestId大于保存在 合同。 如果满足所有要求,则合同会批准更改合同时的minting和mintRequestId。

这种方法太简单了吗?薄弱环节在哪里,您将如何修补它们? 能以某种方式伪造签名吗?

谢谢。

0 个答案:

没有答案