Чтение и интерпретация информации из хранилища контрактов

Я знаю, что хранилище контрактов на блочной цепочке Ethereum не зашифровано и не закрыто каким-либо образом. Все данные в блочной цепочке доступны для просмотра. Даже значение переменной, объявленной как private, может быть известно путем синхронизации с блочной цепочкой и чтения хранилища контрактов. Мой вопрос: насколько простым или сложным является считывание данных хранилища контракта и извлечение из него некоторой информации, не зная структуры данных, то есть как организованы данные?

Например, в следующем частичном коде (только что сформированном некоторой произвольной структуре данных) предположим, что есть внутренняя функция, которая определяет, разрешено ли конкретному msg.sender обращаться к данным:

contract DataStore {

    struct Datum {
        uint8   id;
        bytes32 serialNum;
        string  name;
        uint256 createdAt;
    }

    mapping (address => Datum) private entityData; 

    function getName(address entity) public constant returns (string) {
        if (isAllowed(msg.sender) {
            return name;
        }
        else {
            return "";
        }
    } 
    ...
    ...

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

Я просто хочу понять, насколько это сложно. Я знаю, что «безопасность от неизвестности» не очень хорошая идея, поэтому я не намерен полагаться на нее в своем коде. Просто любопытно.

5 голосов | спросил Ajoy Bhatia 22 AMpSat, 22 Apr 2017 01:46:39 +030046Saturday 2017, 01:46:39

1 ответ


3

Состояние может быть восстановлено (отключено) с использованием чего-то вроде RPC-интерфейса непосредственно против узла, но мне кажется, что проще просто получить транзакцию, которая устанавливает значение данных (при условии, что оно отправлено в ясности) , В вашем примере отсутствует функция, например

function setName(...)

Я думаю, что функция должна была бы присутствовать для того, чтобы данные вошли в контракт в первую очередь.

Эта транзакция 'setter' будет видна так же легко, как смотреть http://etherscan.io для транзакций по умному контракту. Если вы отправили данные в виде чистого текста, это было бы легко восстановить.

Если вы отправили данные в контракт в каком-то зашифрованном виде, тогда «snoop» не только не сможет увидеть его в транзакции, но и не сможет увидеть его в состоянии.

В ответ на ваш прямой вопрос: да - вы можете получить данные состояния через RPC, но это проще, чем это.

ответил Thomas Jay Rush 23 PMpSun, 23 Apr 2017 22:01:09 +030001Sunday 2017, 22:01:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132