confirmexit теперь обходит сет LEDGER2_EXIT_REFUND_WALLETS (w.reg.minshr + w.wal.share + w.cap.blago): собирает доступные L3-балансы каждого (>0), консолидирует на главный паевой (w.reg.minshr→o.reg.mvmin, w.cap.blago→ o.cap.wthcap) и ставит полную сумму на возврат единым платежом. Раньше хардкодил только minshr+share — паевой в Благоросте оставался висеть. Сет задан один раз в wallets.hpp (источник истины), генерируется gen:from-cpp в cooptypes (LEDGER2_EXIT_REFUND_WALLETS / EXIT_REFUND_WALLET_NAMES) и обходится backend-preview (getReturnPreview) — расчёт на фронте всегда совпадает с тем, что реально вернёт контракт. Подпись «планируемая сумма / итог фиксирует Совет» убрана из ExitButton и ExitOverlay (сумма теперь авторитетна). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
REG
Стек: C/C++, eosio.cdt 1.5.0
Введение
Поскольку каждый новый аккаунт системы должен получить ресурсы RAM, CPU и NET, а количество ресурсов в системе ограничено, то все регистрации являются платными и за них кто-то должен заплатить в системном токене. Регистратор обеспечивает работу FREEMIUM бизнес-модели, при которой, пользователь получает возможность ограниченного использования любого продукта системы до истечения срока давности пользования своим гостевым аккаунтом. Регистратором нового аккаунта может выступить любой аккаунт системы и получить комиссию за это.
Компиляция
Заменить ABSOLUTE_PATH_TO_CONTRACT на абсолютный путь к директории контракта reg.
docker run --rm --name eosio.cdt_v1.5.0 --volume /ABSOLUTE_PATH_TO_CONTRACT:/project -w /project eostudio/eosio.cdt:v1.5.0 /bin/bash -c "eosio-cpp -abigen -I include -R include -contract reg -o reg.wasm registrator.cpp" &
Установка
cleos set contract registrator ABSOLUTE_PATH_TO_CONTRACT -p registrator
Генерация документации
Требуется Doxygen версии от 1.9.3
git submodule update --init --recursive
doxygen
Действующие аккаунты
- me - собственное имя аккаунта контракта
- partners - имя аккаунта контракта хранилища партнёров
- core - имя аккаунта цифровой экономики ядра
- system_account - имя аккаунта системного контракта
Основные управляющие параметры
- GUEST_EXPIRATION - продолжительность гостевого периода, после которого, аккаунт может быть отозван
- SYMBOL - системный токен
- ramcore_symbol - идентификационный токен рынка оперативной памяти
- RAM_symbol - токен рынка оперативной памяти
- MIN_AMOUNT - комиссия, взымаемая регистратором за пользование гостевым аккаунтом
- BASKET - количество гостевых аккаунтов, которые могут быть отозваны за один вызов действия
Роли
- Пользователь. Гость или партнёр, чей аккаунт регистрируется.
- Регистратор. Тот, кто регистрирует аккаунт и оплачивает ресурсы аккаунта.
Пополнение баланса
Для совершения действий регистрации аккаунта, необходимо обладать системным токеном на своём балансе в регистраторе. Для пополнения баланса, необходимо отправить перевод на аккаунт контракта в системном токене с указанием регистратора в поле memo:
cleos transfer your_account registrator "100.0000 FLOWER" "registrator"
После чего можем получить баланс регистратора из таблицы:
cleos get table registrator registrator balance
В ответе будет баланс:
"rows": [{
"username": "registrator",
"quantity": "100.0000 FLOWER"
}
],
Регистрация гостя
Для регистрации аккаунта в качестве гостя, необходимо вызвать метод regaccount, передав параметр is_guest = true:
cleos push action registrator regaccount '[registrator, "", tester, EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV, "1.0000 FLOWER", "1.0000 FLOWER", 16384, true, false]' -p registrator
Тогда, получив аккаунт tester, мы увидим, что права владельца находятся у регистратора:
permissions:
owner 1: 1 registrator@eosio.code,
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: 16 KiB used: 2.908 KiB
net bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 0 bytes
available: 3.169 TiB
limit: 3.169 TiB
cpu bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 0 us
available: 92.31 hr
limit: 92.31 hr
Для оплаты регистрации, гость должен пополнить свой баланс и вызвать метод payforguest:
cleos push action registrator payguest '[registrator, tester, "3.2786 FLOWER"]' -p registrator
Сумма к оплате может быть получена в таблице guests. Она расчитывается исходя из стоимости оперативной памяти в момент регистрации и количества системного токена, закладываемого в CPU и NET.
После оплаты, мы можем убедиться, что права владельца аккаунта находятся у владельца ключа:
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: 16 KiB used: 2.926 KiB
net bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 97 bytes
available: 3.109 TiB
limit: 3.109 TiB
cpu bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 23.16 ms
available: 90.57 hr
limit: 90.57 hr
Регистрация партнёра
Для регистрации аккаунта в качестве гостя, необходимо вызвать метод regaccount, передав параметр is_guest = false:
cleos push action registrator regaccount '[registrator, "", tester2, EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV, "1.0000 FLOWER", "1.0000 FLOWER", 16384, true, false]' -p registrator
Тогда, получив аккаунт tester2, мы увидим, что права владельца находятся у владельца ключа:
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: 16 KiB used: 3.365 KiB
net bandwidth:
staked: 1.0000 FLOWER (total stake delegated from account to self)
delegated: 0.0000 FLOWER (total staked delegated to account from others)
used: 0 bytes
available: 3.109 TiB
limit: 3.109 TiB
cpu bandwidth:
staked: 1.0000 FLOWER (total stake delegated from account to self)
delegated: 0.0000 FLOWER (total staked delegated to account from others)
used: 0 us
available: 90.57 hr
limit: 90.57 hr
Отзыв аккаунта гостя
Для того, чтобы отозвать аккаунт у гостя, необходимо вызвать метод update. Метод получает таблицу guests с сортировкой по ключу expiration_at, и заменяет активные ключи аккаунтов на себя. Количество аккаунтов к отзыву за один вызов метода update регулируется константой BASKET. Вызов метода может осуществить любой аккаунт сети.
cleos push action registrator update '[]' -p registrator
Получив объект аккаунта истекшего гостя, увидим, что активные права доступа теперь принадлежат регистратору:
permissions:
owner 1: 1 registrator@eosio.code,
active 1: 1 registrator@eosio.code,
memory:
quota: 16 KiB used: 2.891 KiB
net bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 0 bytes
available: 3.109 TiB
limit: 3.109 TiB
cpu bandwidth:
delegated: 1.0000 FLOWER (total staked delegated to account from others)
used: 0 us
available: 90.57 hr
limit: 90.57 hr
Все отозванные аккаунты хрянятся в таблице reserved:
cleos get table registrator registrator reserved
В ответе список отозванных аккаунтов с указанием регистраторов:
"rows": [{
"username": "eyfyjkpbctwv",
"registrator": "registrator"
},{
"username": "hgrmogbyerml",
"registrator": "registrator"
},{
"username": "yotlnhctihdg",
"registrator": "registrator"
}
]
Документация к методам и таблицам контракта
Документация к методам и таблицам контракта доступна в папке docs/html/index.html
TODO
- Рассмотреть возможность внедрения бизнес-модель доходного пула ликвидности для аккаунтов, обеспечивающих регистрацию гостей. Сейчас каждый регистратор обеспечивает оплату стоимости аккаунта собственными средствами. Предоставить возможность собирать средства на оплату новых регистраций из числа средств партнёров.
- Внедрить систему оценки и выдачу коротких имён.
- Убрать LEGACY связь с контрактом core в методе payforguest.