-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #28 from golos-blockchain/0.9.76
0.9.76
- Loading branch information
Showing
24 changed files
with
1,272 additions
and
246 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,4 +18,5 @@ jobs: | |
with: | ||
node-version: 16 | ||
- run: yarn install | ||
- run: yarn build | ||
- run: yarn test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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". |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`, в который передавайте саму шифровку. | ||
Расшифровать шифровку пока что может только автор или спонсор автора. |
Oops, something went wrong.