Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
orator
7 лет назад

Изучаем кишки 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. То есть без привязки к соц. сети и пр. Вопрос важный, так как если это невозможно, то сеть не является в полной мере децентрализованной.

Скажу сразу, мне это пока этого сделать не удалось. Если кто знает в чем проблема -- просьба поделиться.

Итак, для регистрации потребуется

  1. Сгенерировать 4 ключа нового пользователя (подробнее ниже).
  2. Сформировать 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-библиотеку, выглядит наиболее простым.

Кому тема интересна – просьба отписываться в комментариях и подписываться, исследование не завершено. Пробовали ли вы зарегистрировать нового пользователя в обход сайта? Получилось ли у вас?

0
6.790 GOLOS
На Golos с May 2017
Комментарии (3)
Сортировать по:
Сначала старые