Вот какой вопрос пришел мне в голову: можно ли скрыть какую-то переменную в хранилище контрактов?
Формально, можем ли мы каким-то образом провести транзакцию (или серию транзакций) так, чтобы в итоге в некоторой позиции p
некоторого контракта хранилось произвольное значение, где вероятность того, что это значение хранится в некоторой позиции q
, равна 1 / 2^256
для всех q
(или ничтожно мала для некоторых других q
)?
Обратите внимание, что нам не важно, знаем ли мы, что это за значение, мы просто не хотим показывать, где оно хранится. Я также предпочитаю, чтобы здесь не использовались случайные оракулы.
На самом деле я не знаю ответа на эту проблему! На самом деле, и я здесь, чтобы увидеть ваши комментарии! Так что давайте, давайте вместе пораскинем мозгами 🧠🌪️.
Моя попытка
Моя первоначальная идея состояла в том, чтобы иметь контракт на хранение данных со следующим кодом во время выполнения:
PUSH1 0xFF // our arbitrary value
<some position>
SSTORE
Если я delegatecall
этого парня после того, как каким-то образом назначу позицию, у меня в хранилище будет произвольное значение.
Затем нужно решить, как передать это значение позиции в этот контракт так, чтобы оно не было замечено в транзакции.
Что я попытался сделать:
- Я пытался понять, могу ли я как-то использовать баланс в качестве позиции, и попытаться отправить эфир, не показывая его.
selfdestruct
— единственный способ сделать это неявно, но это можно увидеть во внутренних транзакциях. - Даже если мы каким-то образом получим баланс к нашему контракту, мы должны избавиться от него в той же транзакции, чтобы его нельзя было увидеть потом, а мы не можем этого сделать. Даже если
selfdestruct
сработает, хранилище тоже очистится. - Хорошо, тогда, может быть, я могу получить баланс какого-то другого адреса и использовать его как свою позицию? Хотя, как мы предоставим этот адрес, не показываясь.
- …
Обратите внимание, что это просто из любопытства и ради вызова. На момент написания этой статьи я на %99 уверен, что это вообще невозможно. Тем не менее, то, что я не могу формально доказать, я не могу быть уверен в этом; так что вот так.
Другие интересные моменты:
- Могу ли я как-то использовать встроенную сборку для установки
.slot
переменной, чтобы скрыть ее? - (возможно, добавлю еще что-нибудь по мере редактирования сообщения)