Что мешает получателю выполнить нежелательный смарт-контракт

Я искал в Интернете об этом, но я не могу найти реальный ответ.

Скажем, кто-то отправляет смарт-контракт на какой-то адрес. Что делать, если получатель не хочет принимать этот контракт? Как они «отрицают» контракт или препятствуют его исполнению?

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

Ответы (2)

Вы не можете «отправить контракт кому-то». Вы можете развернуть контракт в блокчейне, но люди должны взаимодействовать с контрактом из своей учетной записи, чтобы контракт повлиял на них. Единственное, что вы можете сделать без согласия принимающей стороны, это отправить им эфир, но тогда вы просто выбрасываете свои деньги.

Как получатель узнает, что данные в контракте верны, прежде чем взаимодействовать с ним?
Если я не ошибаюсь, вы можете переопределить поведение платежа по умолчанию и throwв контракте на получение заблокировать платеж. Кроме того, договор может затрагивать пользователя, не являющегося его стороной. Я мог бы написать (если бы знал, как писать контракты) контракт токена ERC20, представляющий акции в реальной организации, и инициализировать набор акционеров. Физическое лицо, названное владельцем (через acnt), теоретически может получить кредит от кого-то, используя токены в качестве залога, не взаимодействуя с контрактом. Вы даже можете отдать долг пользователю в токене. Таким образом, я думаю, что 2/3 приведенных выше утверждений неверны.
(Кроме того, я понимаю, что второй пример прорывается в физический мир, но это причина, по которой одна сторона может отрицать действительность контракта, не взаимодействуя с ним онлайн)
@lungj Я имел в виду учетные записи пользователей, а не контракты. Насколько я знаю, вы не можете запретить кому-либо отправлять эфир на личный счет (то есть на счет, с которым не связан код). Не то чтобы у вас были какие-то причины для этого. И, конечно же, кто-то может назначить вам случайные токены ERC20, но если вы не будете действовать в соответствии с этим, они просто останутся там. Вы можете доказать, что никогда не участвовали в них. И уж точно нельзя кому-то «отдать в долг». Мой ответ был предназначен для того, чтобы успокоить ОП, поскольку я понял, что он беспокоится о том, что он будет вовлечен в некоторые транзакции против своей воли.
Я думаю, вы правы - вы не можете запретить кому-то отправлять эфир на счет. Однако я могу придумать причину, по которой вы это сделаете: если у вас строгая политика KYC, вы не захотите принимать эфир от всех пользователей и не захотите платить за газ из своего кармана, чтобы вернуть сумму. . Перечитав вопрос ОП, я думаю, что ваша интерпретация лучше, чем та, что была у меня раньше; Я думал, что получатель был агрессором, а не жертвой. (Кроме того, вы можете передать долг кому-то через blckchn. Вы можете делать много вещей в юридических контрактах. Исполнимы ли они или нет, это другой вопрос.)
Как вы можете дать кому-то долг через блокчейн? Я имею в виду, что вы можете написать фиктивный контракт с balanceполем и поместить случайный счет в отрицательное значение, но это эквивалентно тому, что я написал «вы должны мне 1 миллиард долларов» на листе бумаги, на самом деле это ничего не значит, и это не имеет юридической силы. Если вы знаете способ сделать это, пожалуйста, поделитесь им со мной, и мы сможем разбогатеть :p

(Я предполагаю, что под «отправляет смарт-контракт на какой-то адрес» вы имеете в виду «вызывает контракт на какой-то адрес»). Предположим, что на двух учетных записях, A и B, есть 10 эфиров. Если кто-то вызовет функцию в смарт-контракте по правилам Ethereum, которая, скажем, переведет 1 эфир со счета A на счет B, то все, кто следует правилам Ethereum, согласятся, что на счете A теперь 9 эфиров, а на счете B — 11. , Если бы кто-то проигнорировал вызов функции, осуществляющей перевод, он все равно подумал бы, что на счете А есть 10 эфиров, а на счете Б — 10.

По сути, это ничем не отличается от владельца учетной записи A, который просто модифицирует свой клиент Ethereum, чтобы кредитовать учетную запись A миллионом эфира из воздуха. В результате учетная запись А имеет другую субъективную реальность, чем все остальные.

Почему это важно? Представьте, если бы я один считал, что канадские доллары (CAD) равны долларам США (USD), и пошел бы в американский ресторан и заплатил канадскими долларами по номинальной стоимости. В результате, как и следовало ожидать, ресторан не принял мой платеж. Результат был бы совсем другим, если бы ресторан также считал, что доллар = канадский доллар. Тогда они примут мой платеж, но никто другой не примет наши CAD наравне. Так что это сильно мешает ресторану поверить в то, что доллар = канадский доллар, что никто, кроме меня, не будет верить в это. Они сильно мотивированы следовать тому, во что верит большинство людей, потому что это, при прочих равных условиях, дает им наибольшую полезность для их CAD и USD. Для любого ограниченного рационального мыслителя это также верно. Таким образом, вы ожидаете, что все сойдутся в одном едином убеждении в ценности долларов США и канадских долларов.из корыстных соображений . См. также этот вопрос о том, почему может сойтись конкретное значение для CAD и USD.

Итак, если учетная запись B игнорирует вызов функции, как учетная запись A получает уведомление о том, что функция не вызывалась? И откуда остальная часть блокчейна знает, что функция не вызывалась счетом Б и что средства никогда не переводились?
Это не учетная запись , которая может решить изменить запись баланса, это узлы Ethereum. В приведенном выше я предполагаю, что владелец каждой учетной записи запускает свой собственный узел. Представьте, что каждый узел является бухгалтером. Я могу крикнуть: «Перевести 1 эфир со счета А (который я контролирую) на счет Б, если на счету А более 3 эфиров». Это вызов функции, транслируемый в сеть. И, поскольку в этом примере я управляю счетом А, у меня есть полномочия на этот перевод.
Конечно, один бухгалтер мог бы проигнорировать тот факт, что я выкрикнул это, но теперь книги этого бухгалтера неверны (если смотреть с точки зрения всех остальных). Если бы я крикнул: «Добавь миллион эфиров на счет А», это не разрешено правилами Ethereum, и только коррумпированный бухгалтер (например, тот, которого я контролирую) зафиксировал бы эту транзакцию. Но если бы я попытался потратить что-то из этого (при условии, что у меня еще нет законного миллиона эфира), другие бухгалтеры сказали бы: «Эй, подождите! Вы не можете этого сделать!» И любой, кто спрашивает своих бухгалтеров, получили ли они оплату, услышит «нет».