Изучаем кишки golos.io 2: Регистрация в обход сайта
Привет всем софто-девелоперам. Продолжаем изучать кишки golos.io.
См. Изучаем кишки golos.io: вечер 1. Если тема вам интересна -- подписывайтесь и комментируйте!
Вчера убил весь день, с утра до ночи. Удалось достичь совсем малых результатов.
Список проектов
Для начала составил список интересных проектов, которые мне помогли.
Адрес репозитория | Описание |
---|---|
github.com/steemit/steem и github.com/GolosChain/golos | Основная библиотека на C++ steem и ее форк для golos.io |
github.com/steemit/steem-js, github.com/dacom-dark-sun/golosjs и др. | Библиотека на JS для работы через WebSockets (wss://ws.golos.io). Первая для steem оригинал, остальные форки (их несколько, не знаю какой лучше). |
github.com/steemit/steem-js, github.com/dacom-dark-sun/golosjs и др. | Библиотека на JS для работы через WebSockets (wss://ws.golos.io). Первая для steem оригинал, остальные форки (их несколько, не знаю какой лучше). |
github.com/Chainers/Ditch/golosjs и github.com/Chainers/Cryptography.ECDSA | Библиотека для golos на .Net C# и вспомогательная библиотека с криптографией. Реализована только одна операция -- голосование (зато работает). |
Сорри, ребят. Я люблю строгие языки, привык к C# и Java. Поэтому все будут делать на основе C#-библиотеки, как наиболее удобной. Конечно, без JS не обойтись, так как в ней реализованы практически все операции. К хардкорной версии C++ буду обращаться в крайнем случае. Надеюсь этого набора хватит.
Задание 1: пробуем зарегистрироваться в обход сайта
Выбрал самую, как показалось, интересную задачу: зарегистрироваться в обход сайта golos.io. То есть без привязки к соц. сети и пр. Вопрос важный, так как если это невозможно, то сеть не является в полной мере децентрализованной.
Скажу сразу, мне это пока этого сделать не удалось. Если кто знает в чем проблема -- просьба поделиться.
Итак, для регистрации потребуется
- Сгенерировать 4 ключа нового пользователя (подробнее ниже).
- Сформировать JSON-пакет и отправить его на golos.io по WebSocket.
Генерация ключей
В steem/golos для каждого пользователя существует 4 ключа: owner, active, posting, and memo. Оказывается, все они генерируются на основе пароля по простому алгоритму (код рабочий, можно добавлять в Ditch):
const string role = "active"; // owner, active, posting, and memo const string password = "PASSWORD"; var privateKeyBytes = System.Security.Cryptography.SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(account + role + password)); var privateKeyBase58Value = ByteArrayToBase58(privateKeyBytes);
В библиотеке Ditch генерации нет, но ее можно вызвать из JS-версии прямо из консоли (работает в steem-версии).
Кстати говоря, привести открытый ключ к нужному формату (который указывается в настройках кошелька на сайте) – мне так и не удалось. Вроде бы это не хеш а само значение ключа (32 байта) с применением компрессии. Если @steepshot читает, то просьба тоже заняться этим вопросом и обновить библиотеку Cryptography.ECDSA.
Формирование и отправка пакета
В документации steem нет метода account_create, и вообще документация довольно скудная, нужно все выуживать из исходного кода. В версии на JS есть пример пакета в тестовых данных:
it("account_create", ()=> { let tx = {"ref_block_num": 19297,"ref_block_prefix": 1608085982,"expiration": "2016-03-23T22:41:21","operations": [ ["account_create",{"fee": "0.000 STEEM","creator": "initminer","new_account_name": "scott","owner": {"weight_threshold": 1,"account_auths": [],"key_auths": [ ["STM7DTS62msowgpAZJBNRMStMUt5bfRA4hc9j5wjwU4vKhi3KFkKb",1 ]]},"active": {"weight_threshold": 1,"account_auths": [],"key_auths": [ ["STM8k1f8fvHxLrCTqMdRUJcK2rCE3y7SQBb8PremyadWvVWMeedZy",1 ]]},"posting": {"weight_threshold": 1,"account_auths": [],"key_auths": [ ["STM6DgpKJqoVGg7o6J1jdiP45xxbgoUg5VGzs96YBxX42NZu2bZea",1 ]]},"memo_key": "STM6ppNVEFmvBW4jEkzxXnGKuKuwYjMUrhz2WX1kHeGSchGdWJEDQ","json_metadata": ""} ]],"extensions": [], "signatures": []} let tx_hex = "614bde71d95f911bf3560109000000000000000003535445454d000009696e69746d696e65720573636f74740100000000010332757668fa45c2bc21447a2ff1dc2bbed9d9dda1616fd7b700255bd28e9d674a010001000000000103fb8900a262d51b908846be54fcf04b3a80d12ee749b9446f976b58b220ba4eed010001000000000102af4963d0f034043f4b4b0c99220e6a4b5d8b9cc71e5cd7d110f7602f3a0a11d1010002ff0de11ef55b998daf88047f1a00a60ed5dffb0c23c3279f8bd42a733845c5da000000" // 03 53 54 45 45 4d 0000 assert.equal("STEEM", new Buffer("535445454d", "hex").toString()) let tx_object1 = ops.signed_transaction.fromObject(tx) let tx_object2 = ops.signed_transaction.fromHex(tx_hex) assert.deepEqual(tx, ops.signed_transaction.toObject(tx_object1)) assert.deepEqual(tx, ops.signed_transaction.toObject(tx_object2)) assert.deepEqual(tx_hex, ops.signed_transaction.toHex(tx_object1)) assert.deepEqual(tx_hex, ops.signed_transaction.toHex(tx_object2)) })
Это единственная зацепка.
Итак, я сформировал пакет по образцу и попытался отправить:
{"method":"call","params":[3,"broadcast_transaction",[{"ref_block_num":51826,"ref_block_prefix":2971154753,"expiration":"2017-06-05T06:24:12","operations":[["account_create",{"fee":"0.000 GOLOS","creator":"orator","new_account_name":"oratorn","owner":{"account_auths":[],"key_auths":[["GLS5QEqXdgSQBScYs51MnWZ7cf8aehsgJiBfT6dC69jTB2SR57mbA",1]],"weight_threshold":1},"active":{"account_auths":[["GLS5QEqXdgSQBScYs51MnWZ7cf8aehsgJiBfT6dC69jTB2SR57mbA",1]],"key_auths":[["GLS6DCHHHUKnVmbpX9rerxgHf7xpc9VojryfXWS6Sh5Sa8hP6ThVU",1]],"weight_threshold":1},"posting":{"account_auths":[],"key_auths":[["GLS87Hx6pHCSvqYa9iyfdVzHQTC1NraYzDezohdVSGd9aUGpLG96m",1]],"weight_threshold":1},"memo_key":"GLS6wWKcMD7svdvYo59pbroUDLvR7QvYtSUU5rjV5cTLWthLLeBmX","json_metadata":""}]],"extensions":[]}]],"jsonrpc":"2.0","id":1}
Однако постоянно получаю ошибку:
"message": "10 assert_exception: Assert Exception\nis_valid_account_name(item.first): \n {}\n th_a authority.cpp:46 validate
Что это значит – из текста ошибки не ясно. Пробовал и с добавлением подписи и без – текст ошибки не изменился (хотя если в запросе нет какого-либо обязательного параметра – сервер услужливо об этом сообщает).
Выводы и дальнейшие исследования
Выводы делать рано. Быть может у меня чего-то не хватает в запросе (документации нет, так сразу не скажешь). А может и функция регистрации через API отключена для golos.io в целях борьбы со спамом (но тогда, опять-таки, у сети есть владелец и она уже не всеобщее достояние).
Поскольку документации нет, то единственная возможность что-либо исследовать – запускать работающие программы библиотеки и смотреть как они работают. В частности, можно попробовать настроить CLI-кошелек и JS-библиотеку, выглядит наиболее простым.
Кому тема интересна – просьба отписываться в комментариях и подписываться, исследование не завершено. Пробовали ли вы зарегистрировать нового пользователя в обход сайта? Получилось ли у вас?