Сделайте умный контракт, отслеживайте обменный курс и принимайте только платежи установленного значения. - PullRequest
0 голосов
/ 16 октября 2018

Я заключил умный договор на получение платежа, который затем выплачивается на 2 других адреса, деля общую полученную стоимость на 2 акции по 10% и 90% соответственно.Он должен использоваться на веб-сайте вместе с платным доступом.Я сделал это некоторое время назад, и это, кажется, работает (опубликовано в основной сети 6 месяцев назад, используется на этой странице: http://www.linebreakrecords.com/plaintext.php несерьезный магазин, я только учусь использовать блокчейн на сайтах).Однако используемый мной код является базовым и в некоторых местах устарел (когда я смотрю в Remix, теперь я получаю предупреждения о том, что не нужно использовать префиксы emit и «Потенциальное нарушение шаблона Checks-Effects-Interaction», а также «функцию отката»).требует слишком много газа (бесконечно) ».

Во-первых, я надеюсь на рекомендации о том, как сделать этот код более надежным / безопасным и совместимым с современной практикой.Во-вторых, я надеюсь на рекомендации о том, как сделать так, чтобы контракт принимал только транзакции выше определенной стоимости (например, 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 голосов
/ 22 октября 2018

Это неплохой контракт, но он определенно может использовать некоторые улучшения.Я указал несколько вопросов ниже, но всегда может быть больше.Работа по умному контракту требует параноидального мышления при тестировании, так как вы работаете с реальными деньгами, и если вы запутались, у вас не останется банка, чтобы отменить транзакцию для вас (пример четности все еще сожжен ETH и будет наиболеескорее всего, так и останется).

Надеюсь, это поможет вам улучшиться, и дайте мне знать, если вам нужна дополнительная помощь!Если мой ответ соответствует тому, что вы искали, не забудьте поставить галочку, чтобы ваш вопрос считался решенным.

Tabbing;)

  • Помогите мне здесь, человек,Трудно прочитать ваш фрагмент.

События

  • Подумайте, какова цель события.Чтобы предупредить вас о том, что что-то произошло в цепочке блоков.
  • Если это так, зачем генерировать два события, каждое из которых содержит только один фрагмент информации, если в цепочке блоков произошло только одно единственное событие .
  • Также вам нужно emit перед вызовом вашего события в более новых версиях Solidity (https://solidity.readthedocs.io/en/v0.4.21/contracts.html#events), и это разрешено в более старых версиях, поэтому можно добавить его, чтобы уточнить, что это не случайный вызов функции.

Конструкторы

  • Инициализируйте два адреса, между которыми вы будете разделять деньги, в конструкторе вашего контракта, а не при каждом получении эфира.

Math

  • То, как вы разделили свои деньги, пугает. Вы проверяли это и проверяли, что в контракте после каждой транзакции будет 0 Ether?
  • При делении на 10 в контракте вы можете сделать несколько классных предположений о числе, которое вы не можете обычно использовать. А пока представьте числа в Солидности как базовые десять чисел с ограничением на цифру.s (это биты, но достаточно близко).
  • Таким образом, мы ограничены 5 цифрами без десятичных знаков в коде, но мы интерпретируем число как 3 цифры числа и 2 десятичных числа.Это составляет 12525 125,25.Разделить 125.25 на 10 в Солидности означает сдвинуть каждую цифру вправо и добавить 0 впереди.
  • Это делает 125.25 / 10 = 12.52 и 12.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 () `function.
  • Правильный способ сделать математику - вычислить либо 90%, либо 10%.Затем вычтите результат из полученного вами количества эфира, чтобы найти другое значение для отправки.В приведенном выше примере вы бы сделали 125.25 - 12.52 = 112.73, и не было бы остатка.
  • И для большинства любых умных контрактных работ вы должны использовать SmartMath , чтобы предотвратить проблемы с избыточным / недостаточным

Прогноз газа

  • Я очень редко вижу, что это правильно, поэтому я не буду обращать на это внимание после того, как вы просмотрите его.
  • Это часто вызываетсяциклы в вашей функции или что-то еще, что оставляет Solidity без понятия, сколько газа вы будете использовать.
  • Всегда просматривайте его, потому что вы никогда не узнаете, есть ли у вас неопределенный цикл или что-то еще.
  • Хотя он может и не знать, сколько газа требуется вашей функции, он абсолютно прав в отношении предупреждения о резервной функции.
  • Если резервной функции требуется больше, чем минимальный газ, необходимый для транзакции, она потерпит неудачу, и эточто-то, чего никогда не делал опытный контрактный разработчик, так что следите за этим.
  • Мой совет не связываться с резервными функциями, хотя я всегдаобнаружил, что это бессмысленная функция (в том смысле, что они могут запускать код), и я никогда не включаю ее (что делает невозможным отправку эфира в мой контракт без вызова оплачиваемой функции).
  • Вместо этого используйте оплачиваемые функции в любое время, когда вы хотите, чтобы ваш контракт получал эфир, и выполняете некоторую функцию впоследствии.
  • Если вы просто хотите, чтобы ваш контракт мог выполнять все закодированные вещи И получать бессмысленные пожертвования (кто-то простожелая быть хорошим), это был бы вариант использования для функции резервирования.
  • Но опять же, если у вас есть резервная функция, кто-то новичок в ethereum может просто отправить эфир на ваш контракт вместо вызова функции, и вы примете это как пожертвование.
  • Это еще одна причина, по которой япросто имел бы платную функцию donate, которая не имеет кода и просто существует, поэтому, если кто-то отправит эфир в мой контракт без вызова функции, он скажет им, что он недействителен.

Что вы хотите сделать

  • Stackoverflow обычно против такого рода вещей, поэтому старайтесь не говорить, что вы хотите сделать, и ожидать, что мы сделаем это для вас, или объяснить, как это сделать.
  • Лично этоМоя любимая часть программирования, и в больших проектах я волнуюсь, когда просто пишу строки кода, и все решение проблем уже сделано (хотя каждая проблема никогда не решается).
  • Вместо этого спросите о частях, которые вас смущаютбольше всего о том, что вы пытаетесь сделать.
  • Я отвечу так, как если бы вы спросили: «Поэтому я хочу принять толькоnsaction выше определенного значения, и это значение отслеживает обменный курс.Как я могу отслеживать обменный курс? "
  • На всякий случай, если вы не знаете, отклонение эфира, отправленного на подлежащую оплате транзакцию, так же просто, как наличие require с ложным условием.
  • Require - это круто, потому что большинство клиентов могут обнаружить его еще до того, как отправят вам транзакцию, поэтому вы не отклоняете эфир, а вместо этого Metamask сообщает НЕ отправлять транзакцию, потому что она потерпит неудачу.
  • Если они решат отправить его, он все равно потерпит неудачу и отправит обратно эфир без необходимости писать больше кода, но отправленный ими газ будет сожжен.
  • Для отслеживанияобменный курс, который вам действительно понадобится, какой-то Oracle или децентрализованный обмен на Ethereum, который показывает API его цены (я не верю, что существует какой-либо рН).
  • Гораздо более полезный способ сделать это - простоустановите обменный курс вручную и обновляйте его ежедневно. Вы можете настроить его одним нажатием кнопки, чтобы код JS взаимодействовал с любым из 1000 API-интерфейсов цены, чтобы получитьцена, а затем отправить его с вызовом функции.
  • Это определенно не идеальное решение, но получение информации извне блокчейна в блокчейн является довольно сложной задачей.Посмотрите на Oraclize и посмотрите, что они предлагают, которые могут помочь вам выполнить вашу задачу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...