制定智能合约跟踪汇率,仅接受设定值的付款

时间:2018-10-16 17:22:03

标签: blockchain ethereum solidity smartcontracts remix

我已经签订了一份智能合约来接收付款,然后付款到另外两个地址,将收到的总价值分别分为2股,分别为10%和90%。它应与付费墙一起在网站上使用。我前一阵子做了,它似乎起作用了(6个月前发布在mainnet上,用在此页面上:http://www.linebreakrecords.com/plaintext.php并不是一个严肃的商店,而只是我学习如何在网站上使用区块链)。但是,我使用的代码是基本的,现在已经过时了(当我在Remix中查看时,我现在收到有关不使用``发射前缀和'可能违反Checks-Effects-Interaction模式'和'Fallback函数'的警告)。 。需要太多气体(无限大)')。

首先,我希望获得有关如何使此代码更健壮/更安全并符合当前最佳实践的建议。其次,我希望就如何使合同仅接受高于一定价值(例如2美元)的交易并跟踪当前汇率提出建议,以便我将应支付的最低价值设置为2美元,并使其遵循汇率。不论市场如何变化,价格均保持在2美元)。我知道这是非常基本的东西,我在这里提供的代码可能是原始AF,我正在尝试学习,请尽可能帮助。非常感谢。

pragma solidity ^0.4.15;

contract CONTRACT1{

event senderLogger(address);
event valueLogger(uint);

address person1Adress;
address person2Adress;

function () payable { 
senderLogger(msg.sender);
valueLogger(msg.value);

person1Adress = 0x705b4e2d44be431740b11fa9ba6ace47bef8d035;
person1Adress.transfer(msg.value / 10); 

person2Adress = 0xC0BB3c8362628E152f70b602de4B7CFB41516618;
person2Adress.transfer((msg.value / 10) * 9);
} 
}

1 个答案:

答案 0 :(得分:0)

这不是一个糟糕的合同,但肯定可以使用一些改进。我在下面指出了一些问题,但总会有更多的问题。当您使用真钱工作时,智能合约工作需要对测试有偏执的心态,如果您一团糟,就没钱reverse the transaction(您的平价例子仍然是烧掉以太坊,很可能会保持这种状态) )。

希望这对您有所帮助,如果您需要其他帮助,请告诉我!如果我的答案符合您的要求,请不要忘记打勾,这样您的问题就算解决了。

Tabbing;)

  • 在这里帮助我,伙计,很难阅读您的摘录。

事件

  • 考虑事件的目的是什么。提醒您区块链中发生了某些事情。
  • 如果是这样,当区块链上仅发生一个单个事件时,为什么要发出两个事件,每个事件只有一条信息。
  • 此外,在新版本的Solidity(https://solidity.readthedocs.io/en/v0.4.21/contracts.html#events)中进行事件调用之前,您还需要emit,并且在较早版本中允许使用,因此也可以添加它来阐明它不是随机函数调用。 / li>

构造函数

  • 初始化两个地址,您将在合同的constructor中分配资金,而不是每次收到以太币时都要分配。

数学

  • 分配资金的方式令人恐惧。您是否对此进行了测试并确保在每次交易后合同以0 Ether结尾?
  • 当合约中除以10时,您可以对一些您通常无法做到的数字做出一些很酷的假设。现在,将Solidity中的数字视为以10为基数的数字,并以数字为限(以位为单位,但足够接近)。
  • 因此,我们将代码限制为5位数字,没有小数,但是我们将数字解释为3位数字和2位小数。这使得12525为125.25。在Solidity中将125.25除以10就是将每个数字向右移动并在前面添加0。
  • 这使得125.25 / 10 = 12.5212.52 * 9 = 112.68' but 12.52 + 112.68 = 125.2 with .05 left in the contract untouched. Over time this may build up, but either way is burnt ether as you didn't include a function that calls the selfdestruct()函数。
  • 正确的数学方法是计算 90%或10%。然后从您收到的以太量中减去结果以找到要发送的其他值。在上面的示例中,您将执行125.25 - 12.52 = 112.73,并且没有余数。
  • 对于大多数智能合约工作,您应该使用SmartMath来防止流量过大/不足。

气体预测

  • 我很少看到这是正确的,因此在您查看它后我会忽略它。
  • 通常是由于您的函数中存在循环或其他使Solidity毫无头绪的线索而触发的。
  • 始终检查它,因为您永远不知道自己是否有未终止的循环或其他东西。
  • 虽然可能不知道您的函数需要多少天然气,但是关于回退功能的警告是绝对正确的。
  • 如果后备功能需要的费用超过交易所需的最低费用,它将失败,而且没有经验的合同开发人员会这样做。
  • 虽然我的建议是不要搞乱后备功能,但我一直发现它们是无意义的功能(因为它们可以运行代码),并且我从不包含任何功能(因此,如果没有ether can't be sent to my contract调用付费功能)。
  • 当您希望合同收到以太币并随后执行某些功能时,请改为使用应付款功能。
  • 如果您只是希望您的合同能够完成所有编码的工作并收到毫无意义的捐赠(只是希望变得更好),那将是后备功能的用例。
  • 但是再说一次,如果您有一个备用功能,以太坊新手可能只是将以太币发送到您的合约中,而不是调用一个功能,您将把它当作捐赠。
  • 这是另一个原因,我将拥有一个没有代码且仅存在的可偿还的捐赠函数,因此,如果有人向我的合约发送以太币而没有函数调用,则会告诉他们无效。

您想做什么

  • Stackoverflow通常是反对这种事情的,因此请尽量避免说出您想做什么,并期望我们为您做这件事或说明如何做。
  • 就我个人而言,这是我最喜欢的编程部分,在大型项目中,一旦编写了代码行并且所有问题解决都已经完成(尽管从来没有解决过所有问题),我就会感到激动。
  • 相反,请问那些使您最困惑的部分。
  • 我将回答您,就像您在问:“因此,我只想接受高于一定价值的交易,并让该价值跟踪汇率。如何跟踪汇率?”
  • 即使您不知道,拒绝发送给应付交易的以太币也很容易,因为require的状态为假。
  • Require非常棒,因为大多数客户端甚至可以在未检测到它之前 发送交易给您,所以您不是拒绝以太币,而是 相反,Metamask告诉他们不要发送交易,因为 会失败的。
  • 如果他们选择发送它,它仍然会失败并发回以太币 无需编写更多代码,但他们发送的信息会 被烧毁。
  • 为了跟踪汇率,您确实需要某种Oracle或以太坊上的去中心化交易所,以显示其价格API(我相信没有API)。
  • 一种更有用的方法是手动设置汇率并每天进行更新。您可以进行设置,只需单击一个按钮,您的JS代码即可与1000个价格API进行交互以获取价格,然后通过函数调用进行发送。
  • 这绝对不是一个完美的解决方案,但是将信息从区块链外部带入区块链是相当大的挑战。调查Oraclize,看看它们提供了哪些内容,可以帮助您完成任务。