Skip to content

Commit

Permalink
Merge pull request #28 from golos-blockchain/0.9.76
Browse files Browse the repository at this point in the history
0.9.76
  • Loading branch information
Lex-Ai authored Nov 27, 2024
2 parents e612428 + 27bad32 commit 676f8cd
Show file tree
Hide file tree
Showing 24 changed files with 1,272 additions and 246 deletions.
1 change: 1 addition & 0 deletions .github/workflows/js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ jobs:
with:
node-version: 16
- run: yarn install
- run: yarn build
- run: yarn test
6 changes: 6 additions & 0 deletions golos-lib-js/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ golos.api.getAccounts(['ned', 'dan'], (err, response) => {
</script>
```

## Сборка своей golos-lib-js (с загрузкой в npm)

Вы можете собрать свою собственную копию golos-lib-js, чтобы дополнительно проаудировать ее, или, к примеру, доработать для использования в специфических проектах\задачах.

[См. здесь](https://github.com/golos-blockchain/libs/tree/master/golos-lib-js/docs/files/build.md).

## Загрузка модуля WebAssembly

[См. здесь](https://github.com/golos-blockchain/libs/tree/master/golos-lib-js/docs/files/wasm.md).
Expand Down
49 changes: 49 additions & 0 deletions golos-lib-js/check_integrity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const fs = require('fs')
const { hashElement } = require('folder-hash')

async function main() {
try {
const hashOut = './lib/my_hash.js'

const path = '../golos-lib-js'
const res = await hashElement(path, {
files: {
exclude: [
path + '/lib/my_hash.js',
path + '/dist/golos.min.js.gz',
path + '/dist/golos-tests.min.js.gz',
path + '/dist/stats.html',
// These not including when NPM publishes
'.npmrc',
'.babelrc',
'.gitignore',
'.npmignore',
'yarn.lock',
],
matchBasename: true,
matchPath: true,
},
folders: {
exclude: [
path + '/node_modules',
path + '/src',
path + '/examples'
],
matchPath: true,
ignoreRootName: true
}
})

console.log(res.children)

let code = fs.readFileSync(hashOut, 'utf8')
code = code.replace('NO_HASH', res.hash)
fs.writeFileSync(hashOut, code)

console.log('LIBRARY HASH IS', res.hash)
} catch (err) {
console.error('LIBRARY HASH FAILED:', err)
}
}

main()
7 changes: 7 additions & 0 deletions golos-lib-js/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
- [Golos Messenger](./files/msgs.md)
- [Платные подписки](./files/paid_subscriptions.md)
- [NFT](./files/nft.md)
- [Шифрование платных постов (Cryptor)](./files/cryptor.md)
- [Утилиты, ускоряющие разработку клиентов](./files/utils)
- [Валидация имен аккаунтов](./files/utils/validate_account_name.md)
- [Asset для финансовых расчетов](./files/utils/asset.md)
Expand Down Expand Up @@ -53,6 +54,12 @@ golos.api.getAccounts(['ned', 'dan'], (err, response) => {
</script>
```

## Сборка своей golos-lib-js (с загрузкой в npm)

Вы можете собрать свою собственную копию golos-lib-js, чтобы дополнительно проаудировать ее, или, к примеру, доработать для использования в специфических проектах\задачах.

[См. здесь](./files/build.md).

## Загрузка модуля WebAssembly

[См. здесь](./files/wasm.md).
Expand Down
69 changes: 69 additions & 0 deletions golos-lib-js/docs/files/build.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
## Сборка своей собственной golos-lib-js

Вы можете собрать свою собственную копию golos-lib-js, чтобы дополнительно проаудировать ее, или, к примеру, доработать для использования в специфических проектах\задачах.

1. Установите [Node 16+](https://nodejs.org/en/download).

2. Установите yarn:
```js
npm install -g yarn
```
Если вы не можете выполнить эту команду, но Node.js установлен, то нужно в переменную PATH добавить путь к `node` и `npm`.

3. Скачайте golos-lib-js нужной версии (`master` - последняя стабильная версия):
```sh
git clone https://github.com/golos-blockchain/libs -b master
```
Если вы не можете выполнить эту команду, установите [Git](https://git-scm.com/).

4. Соберите golos-lib-js:
```js
cd libs
cd golos-lib-js
yarn install
yarn run build
```

5. Если сборка успешна, вы можете проверить корректность сборки с помощью тестов:
```js
yarn run test
```
Если ошибок нет, то вероятно сборка прошла без проблем.

6. При локальной работе со своим проектом вы можете добавлять библиотеку в проект следующим образом:
```js
yarn add /root/libs/golos-lib-js
```
или
```js
npm install /root/libs/golos-lib-js
```
где `/root/libs/golos-lib-js` - полный путь к библиотеке, **собранной** согласно пункту 4.

### Публикация в npm

Чтобы использовать свою сборку golos-lib-js в своих проектах (или своих форках наших проектов), обычно нужно опубликовать ее в npm и использовать оттуда.

1. Создайте аккаунт на https://www.npmjs.com/ если его у вас еще нет.
2. Войдите в него, выполнив команду:
```sh
npm login
```
Потребуется ввести имя аккаунта, пароль, e-mail, и (если вы не настроили иное) одноразовый пароль, который придет на e-mail.
3. Переименуйте свой форк библиотеки, например: `alice-golos-lib-js`
Проверьте, что такой библиотеки еще нет: https://www.npmjs.com/package/alice-golos-lib-js - здесь должно быть 404 not found
4. Снова соберите библиотеку (`yarn build`)
5. **ВАЖНО: удалите зависимости**, то есть папку `node_modules`, мы тоже удаляем е перед загрузкой, поскольку она не покрывается контрол-хешем библиотеки.
6. Выполните команду
```sh
npm publish
```
7. После этого вы можете удалить библиотеку golos-lib-js из проекта:
```sh
yarn remove golos-lib-js
```
и установить свой форк взамен
```sh
yarn add alice-golos-lib-js
```
при этом во всех файлах кода надо поменять "golos-lib-js" на "alice-golos-lib-js".
102 changes: 102 additions & 0 deletions golos-lib-js/docs/files/cryptor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Шифрование постов (cryptor)

### Шифрование поста

Метод следует вызывать перед отправкой операции `comment`. Затем подставлять зашифрованный текст в операцию `comment`

Авторизация не требуется.

```js
async function test() {
let res
try {
res = await golos.api.encryptBodyAsync({
author: 'alice',
body: 'Текст поста'
})
} catch (err) {
console.error(err)
return
}
console.log(res)
}

test()
```

Поля ответа:
- `status` - `"ok"` или `"err"`.
- `encrypted` - зашифрованный пост в виде base64-строки.
- `error` - `"unavailable_no_key_in_config"`, если данная нода не подходит для шифровки поста, или `"unknown"` в случае какой-то иной ошибки.

После того, как пост зашифрован, следует подставить следующее значение как `body` в операцию `comment`:
```js
JSON.stringify({t: 'e', v: 2, c: res.encrypted})
```

`t` указывает, что пост зашифрован, `v` - версия шифрования (1, если пост шифруется с помощью Golos Auth Service; в данном случае - 2 - пост шифруется блокчейном).

### Расшифровка поста

Для расшифровки поста требуется **авторизация**, чтобы доступ к посту имел только автор, либо тот, кто стал спонсором автора, либо тот, кто оплатил `decrypt_fee`, а другие пользователи не могли расшифровать пост от имени автора или спонсора.

- Получить `head_block_number` и `witness` этого блока. Они должны быть не старше 10-30 сек.
- `head_block_number` преобразовать в строку и с помощью `signData()` подписать ее приватным posting-ключом того аккаунта, от имени которого производится расшифровка.
- добавить подпись (в виде HEX-строки) и `witness` в запрос, как показано в примере ниже.

```js
async function test() {
const { head_block_number, witness } = await golos.api.getDynamicGlobalPropertiesAsync()

const signed = golos.auth.signData(head_block_number.toString(), {
posting: '5HwQScueMZdELZpjVBD4gm6xhiKiMqGx18g4WtQ6wVr4nBdSxY5'
})

let res
try {
res = await golos.api.decryptCommentsAsync({
account: 'alice', // обладатель posting-ключа
signed_data: {
head_block_number,
witness,
},
signature: signed.posting,
entries: [{ // одним запросом можно расшифровать сразу много постов, и если какой-то из них расшифровать не удастся, то не сорвется весь запрос
author: 'bob',
permlink // или hashlink, или body
}]
})
} catch (err) {
console.error(err)
return
}
console.log(res)
}

test()
```

Поля ответа:
- `status` - `"ok"` или `"err"`.
- `error` - ошибка запроса в целом (а не ошибки расшифровки отдельных постов. Если не получается расшифровать отдельные посты, то остальные посты все равно будут расшифрованы и статус будет `ok`).
- `results` - результаты расшифровки каждого поста, в том же порядке, что и `entries`.

Ошибки, при которых запрос сорвется целиком:
- `"head_block_num_in_future"`- такого блока еще не существует.
- `"head_block_num_too_old"` - слишком старый блок, больше 30-60 сек. назад. Старые блоки не принимаются, чтобы нельзя было единожды украсть\подделать подпись и в дальнейшем всегда расшифровывать ею посты.
- `"account_not_exists"` - нет такого аккаунта.
- `"illformed_signature"` - неверный формат подписи, т.е. она вообще не является корректной подписью или отсутствует.
- `"wrong_signature"` - формат подписи корректный, но она сделана не актуальным posting-ключом аккаунта, а каким-то другим.

В случае `ok`, каждый из `results` содержит поля:
- `author` - автор поста.
- `body` - расшифрованный текст поста, если расшифровать пост получилось.
- `err` - ошибка расшифровки, если не получилось. Возможные значения: `wrong_json_or_not_encrypted` (пост вообще не зашифрован или его body некорректно), `not_encrypted` (не зашифрован или зашифрован версией 1, которая шифруется не плагином cryptor, а с помощью Golos Auth Service), `cannot_decrypt`, `inactive` (спонсорство истекло), `no_sponsor`, `no_sub` (автор удалил спонсорскую подписку).
- `sub` - параметры платной подписки автора (ее цена), если пост не удалось расшифровать и подписка существует.
- `decrypt_fee` - если расшифровку поста можно оплатить разово, то сколько оплатить.

### Шифрование и расшифровка абстрактных данных. Альтернативные применения cryptor

Уже в первой версии плагин теоретически позволяет шифровать не только посты, но и любые другие данные и использовать это в ваших сервисах на основе Golos.
В запросе на расшифровку в этом случае вместо `permlink\hashlink` используйте `body`, в который передавайте саму шифровку.
Расшифровать шифровку пока что может только автор или спонсор автора.
Loading

0 comments on commit 676f8cd

Please sign in to comment.