0

我已经制定了一个接收付款的智能合约,然后支付给其他 2 个地址,将收到的总价值分别分成 10% 和 90% 的 2 份。它将与付费专区一起在网站上使用。我不久前做了这个,它似乎有效(6 个月前在主网上发布,在此页面上使用:http ://www.linebreakrecords.com/plaintext.php不是一个严肃的商店更多只是我学习如何使用区块链网站)。但是,我使用的代码是基本的,现在在某些地方已弃用(当我在 Remix 中查看时,我现在收到有关不使用“发出前缀和“可能违反检查-效果-交互模式”以及“回退功能”的警告。 .需要太多的气体(无限)')。

首先,我希望获得有关如何使此代码更健壮/安全并符合当前最佳实践的建议。其次,我希望提供有关如何使合同仅接受高于一定价值(例如 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);
} 
}
4

1 回答 1

0

这不是一个糟糕的合同,但它肯定可以使用一些改进。我在下面指出了一些问题,但总会有更多问题。智能合约工作需要在测试时有一种偏执的心态,因为你使用的是真钱,如果你搞砸了,没有银行可以为你撤销交易(平价示例仍然是销毁 ETH,并且很可能会保持这种状态)。

我希望这可以帮助您改进,如果您需要更多帮助,请告诉我!如果我的答案符合您的要求,请不要忘记点击复选标记,以便您的问题被视为已解决。

制表符 ;)

  • 帮帮我,伙计,很难阅读你的片段。

活动

  • 想想活动的目的是什么。提醒您区块链上发生了某些事情。
  • 如果是这样,当区块链上只发生一个事件时,为什么要发出两个事件,每个事件都只有一条信息。
  • 您还需要emit在较新版本的 Solidity ( https://solidity.readthedocs.io/en/v0.4.21/contracts.html#events ) 中调用事件之前,并且在旧版本中允许这样做,所以不妨添加它以澄清这不是随机函数调用。

构造函数

  • 初始化您将在合约的构造函数中分配资金的两个地址,而不是每次收到以太币时。

数学

  • 你分钱的方式很可怕。您是否对此进行了测试并确保合约在每次交易后以 0 Ether 结束?
  • 在合同中除以 10 时,您可以对通常不能的数字做出一些很酷的假设。现在,将 Solidity 中的数字视为以十为基数的数字,并有数字限制(它是位但足够接近)。
  • 所以我们限制为 5 位,代码中没有小数,但我们将数字解释为 3 位数字和 2 位小数。这使得12525125.25。在 Solidity 中将 125.25 除以 10 是将每个数字向右移动并在前面添加一个 0。
  • 这使得12.52 + 112.68 = 125.2 125.25 / 10 = 12.52selfdestruct () 函数。12.52 * 9 = 112.68' butwith .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
  • 计算的正确方法是计算90%10%。然后从您收到的以太币数量中减去结果,以找到要发送的另一个值。在上面的例子中,你会这样做125.25 - 12.52 = 112.73并且没有剩余。
  • 对于大多数智能合约工作,您应该使用SmartMath来防止出现过流/不足流的问题。

气体预测

  • 我很少看到这是正确的,所以在您查看后我会忽略它。
  • 它通常是由您的函数中的循环或其他使 Solidity 不知道您将使用多少气体的东西触发的。
  • 不过,请务必查看它,因为您永远不知道您是否有未终止的循环或其他东西。
  • 虽然它可能不知道您的功能需要多少气体,但它关于回退功能的警告是绝对正确的。
  • 如果后备功能需要的气体超过交易所需的最低气体,它就会失败,并且没有经验丰富的合约开发人员会这样做。
  • 我的建议是不要弄乱后备功能,我一直发现它们是一个毫无意义的功能(因为它们可以运行代码)而且我从不包含一个(这样就不会将以太币发送到我的合约中)无需调用应付函数)。
  • 而是在您希望合约接收以太币并在之后执行某些功能时使用应付功能。
  • 如果您只是希望您的合约能够完成所有编码的事情并接收无意义的捐赠(只是想变得友善),那将是后备功能的一个用例。
  • 但是话又说回来,如果你有一个后备函数,以太坊的新手可能只是将以太币发送到你的合约而不是调用一个函数,你会把它当作捐赠。
  • 这是另一个原因,我只是有一个没有代码并且简单存在的应付捐赠函数,所以如果有人在没有函数调用的情况下将以太币发送到我的合约,它会告诉他们它是无效的。

你想做什么

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