Юзер отправляет монеты на единый для всех специальный адрес, откуда им обычным путём нет возврата. После этого он может с помощью хэша использованного для этого закрытого ключа создать новые монеты. При этом в создающей монеты транзакции будет ссылка на более чем одну уничтожающую транзакцию, принадлежность каждой из которых конкретному пользователю равновероятна. Чем дольше работает такая система, тем больше становится пул из доступных для использования "уничтоженных" монет, и тем труднее становится восстановить историю происхождения конкретного выхода.
Минусы схемы очевидны - накопление мусора в UTXO, в виде груза уничтоженных монет, не поддающихся очистке в виду невозможности определить их статус. Впрочем, этот вопрос можно решить, если заранее ограничить срок их жизни.
Чтобы не плодить дополнительных сущностей, в качестве специального адреса можем использовать тот, на который были отправлены те 110000 монет. Это будет логично, как мне кажется.
Как будет учитываться общий баланс монет? Предположим, я уничтожил 100 монет. Как проверить, что я создал не более 100 новых?
Очень просто, принцип похож на тот что реализуется библиотекой zerocoin. Нельзя уничтожить сумму, отличную от некого заданного заранее N, и создать отличную от этой сумму тоже нельзя. Что при обязательной уникальности используемых ключей дает невозможность двойного воссоздания уничтоженных монет, потому что хэш использованного ключа сохраняется в блокчейне и клиенты в дальнейшем будут отклонять любые транзакции с его использованием.
Остается только решить, каким именно это N будет. Это более чем серьезный вопрос, потому что после запуска системы изменить данный параметр будет уже невозможно даже с помощью хардфорка. Лично мне нравится сумма 100 монет, но у кого-то могут быть другие соображения по этому поводу, так что давайте думать. На одной чаше весов порог вхождения, на другой - пропускная способность данного импровизированного миксера.
а нельзя встроить сразу несколько таких миксеров? на разные N. на 100 10 и 1 монету