Любой может проверить действительность монеты, следуя цепочке хеш-указателей обратно к ее создателю Гуфи, проверяя все подписей на этом пути.
Конечно, с GoofyCoin существует фундаментальная проблема безопасности.
Скажем, Алиса передала свою монету Бобу, отправив подписанное выражение Бобу, но никому не об это не сказала.
Она может создать другое подписанное выражение, которое платит ту же самую монету Чаку.
Для Чака это кажется хорошей действительной транзакцией, и теперь он якобы является владельцем монеты.
Боб и Чак, оба теперь утверждают, что являются владельцем этой монеты.
Это называется атакой двойной траты – Алиса тратит одну и ту же монету дважды.
Интуитивно мы знаем, что монеты не должны работать таким образом.
Фактически, атаки с двойным расходованием являются одной из ключевых проблем, которые необходимо решить любой из криптовалют.
GoofyCoin не решает проблему двойного расходования, и поэтому она не защищена.
GoofyCoin – это простая криптовалюта, и ее механизм передачи монет на самом деле очень похож на биткойн, но поскольку она небезопасна, она не может использоваться как реальная криптовалюта.
Чтобы решить проблему с двойным расходованием, мы разработаем еще одну криптовалюту, которую мы назовем ScroogeCoin.
ScroogeCoin построена на основе GoofyCoin, но она немного сложнее с точки зрения структуры данных.
Первая ключевая идея заключается в том, что первоначальный объект Scrooge публикует бухгалтерскую книгу, в которую можно только добавлять записи, и которая содержит историю всех транзакций, которые произошли.
Свойство только добавления записей обеспечивает то, что любые данные, записанные в эту книгу, останутся навсегда.
Если книга действительно обладает свойством только добавления записей, мы можем использовать ее для защиты от двойного расходования, требуя, чтобы все транзакции были записаны в книге, прежде чем они будут приняты.
Таким образом, транзакции будут общедоступны для просмотра, если монеты были ранее отправлены другому владельцу.
Чтобы реализовать эту функцию только добавления, Scrooge может построить цепочку блоков, структуру данных, которую мы уже видели, и которую он будет подписывать цифровой подписью.
Это серия блоков данных, каждый с одной транзакцией, на практике, в качестве оптимизации, помещается несколько транзакций в один и тот же блок, как у биткойна.