From 14b33861ed84b3156be6df9d86c2b1d119aee700 Mon Sep 17 00:00:00 2001 From: Moul <moul@moul.re> Date: Fri, 9 Oct 2020 11:19:25 +0200 Subject: [PATCH] [doc] Add v0.8 announcement --- release_notes/images/poetry-logo.svg | 1 + release_notes/images/silkaj_pipeline.png | Bin 0 -> 27560 bytes release_notes/v0.8.md | 213 +++++++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 release_notes/images/poetry-logo.svg create mode 100644 release_notes/images/silkaj_pipeline.png create mode 100644 release_notes/v0.8.md diff --git a/release_notes/images/poetry-logo.svg b/release_notes/images/poetry-logo.svg new file mode 100644 index 00000000..89a5088e --- /dev/null +++ b/release_notes/images/poetry-logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 448.17 560"><defs><style>.cls-1{isolation:isolate;}.cls-2{fill:url(#radial-gradient);}.cls-3{fill:url(#radial-gradient-2);}.cls-4,.cls-5,.cls-6{mix-blend-mode:multiply;}.cls-4{fill:url(#linear-gradient);}.cls-5{fill:url(#linear-gradient-2);}.cls-6{fill:url(#linear-gradient-3);}.cls-7{mix-blend-mode:screen;fill:url(#radial-gradient-3);}</style><radialGradient id="radial-gradient" cx="438.3" cy="639.01" r="569.94" gradientTransform="translate(0 0)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6877ec"/><stop offset="0.6" stop-color="#5362cf"/><stop offset="1" stop-color="#4352b9"/></radialGradient><radialGradient id="radial-gradient-2" cx="65.64" cy="-16.21" r="746.46" gradientTransform="translate(0 0)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00d5ff"/><stop offset="0.38" stop-color="#00b8eb"/><stop offset="1" stop-color="#0080c5"/></radialGradient><linearGradient id="linear-gradient" x1="74.77" y1="67.3" x2="277.23" y2="512.72" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#294ca7"/><stop offset="0.48" stop-color="#96a7d4"/><stop offset="0.84" stop-color="#e1e6f3"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="linear-gradient-2" x1="-228.74" y1="-144.29" x2="451" y2="651.89" gradientTransform="translate(0 0)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6877ec"/><stop offset="0.29" stop-color="#97a1f2"/><stop offset="0.77" stop-color="#e2e4fb"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient id="linear-gradient-3" x1="-151.22" y1="-285.9" x2="450.08" y2="430.63" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#8397cc"/><stop offset="0.15" stop-color="#97a8d4"/><stop offset="0.73" stop-color="#e2e6f3"/><stop offset="1" stop-color="#fff"/></linearGradient><radialGradient id="radial-gradient-3" cx="259.68" cy="-34.71" r="431.37" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff"/><stop offset="1"/></radialGradient></defs><title>logo-origami</title><g class="cls-1"><g id="Layer_1" data-name="Layer 1"><path class="cls-2" d="M168.08,560A570.54,570.54,0,0,0,459.84,403.59L56.25,0V448.17Z" transform="translate(-56.25)"/><path class="cls-3" d="M56.25,448.17C303.77,448.17,504.42,247.52,504.42,0H56.25Z" transform="translate(-56.25)"/><path class="cls-4" d="M56.25,448.17h0L73.5,465.42c121.57-4.45,231.4-55.68,312-136.23l-12.29-12.28A446.8,446.8,0,0,1,56.25,448.17Z" transform="translate(-56.25)"/><path class="cls-5" d="M168.08,560A570.54,570.54,0,0,0,459.84,403.59L56.25,0V448.17Z" transform="translate(-56.25)"/><path class="cls-6" d="M459.84,403.59,56.25,0,423.14,437.13C435.83,426.46,448.12,415.31,459.84,403.59Z" transform="translate(-56.25)"/><path class="cls-7" d="M56.25,0,373.16,316.91q4.23-4.25,8.35-8.6Z" transform="translate(-56.25)"/></g></g></svg> \ No newline at end of file diff --git a/release_notes/images/silkaj_pipeline.png b/release_notes/images/silkaj_pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..0024f553fa15125151b23fceb376a34e75d3b2c1 GIT binary patch literal 27560 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 literal 0 HcmV?d00001 diff --git a/release_notes/v0.8.md b/release_notes/v0.8.md new file mode 100644 index 00000000..8c8e4a9a --- /dev/null +++ b/release_notes/v0.8.md @@ -0,0 +1,213 @@ +# Silkaj v0.8.0 release + +## Introduction +The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. +This release comes along with a number of new features and improvements. +The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the [changelog](https://git.duniter.org/clients/python/silkaj/blob/dev/CHANGELOG.md). + +Version 0.8.0 was done in 145 commits, and features seven major improvements: +1. `membership`: We developed a command to allow users to send membership documents. +2. Identity choice: We can now manually choose the desired identity among other identities. +3. Multi-recipients transactions: Users can simultaneously send a different amount of Äž1 to different recipients. +4. Display improvements for `tx` and `balance`: For a better overview, we modified the `tx` table and added a `balance` table. +5. Public key checksum display and verification: For security purposes, Silkaj displays and verifies the checksum. +6. `verify`: We set up a command to check whether a block is valid. +7. Dev Env: We set up a solid development environment for Poetry, CI/CD, and Tests. + - A. Poetry: We migrated to Poetry. + - B. CI/CD: We set up a pipeline to run automatic jobs. + - C. Tests: We started to write tests. + +## 1. Membership +After the transaction and the certification commands, the much awaited `membership` command is now available. + +Users can send their first membership request to be a certified member of the Äž1 community. As certified members have to renew their membership each year, this command allows to send the renewal application in question. It displays the expiration date of the current membership and indicates the identification blockstamp of the user. In the event a user forgets that they have already sent a membership request, a pop up displays if there is a pending membership request in the mempool. + +```bash +silkaj membership +Please enter your Scrypt Salt (Secret identifier): +Please enter your Scrypt password (masked): +You will be asked to approve Äž1 license. Would you like to display it? [y/N]: n +Do you approve Äž1 license? [y/N]: y +â•’â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•• +│ Expiration date of current membership │ in 3 weeks │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Number of pending membership(s) in the mempool │ 1 │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Pending membership documents will expire │ in 1 year │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ User Identifier (UID) │ moul │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Public Key │ GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:J1k │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Block Identity │ 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93… │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Identity published │ March 8, 2017 │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Expiration date of new membership │ in 1 year │ +├────────────────────────────────────────────────────┼───────────────────────────────────────────────────┤ +│ Expiration date of new membership from the mempool │ in 2 months │ +╘â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•› +Do you confirm sending a membership document for this identity? [y/N]: +``` + +## 2. Identity choice +When using the commands `wot`, `cert`, and `membership`, Silkaj used to select the first identity on the list. As this can lead to fishing, we added a new feature to pick the identity of your choice. Now, you can use the `uid` and the `pubkey` to certify an identity and study its status in the Web of Trust. +Please note that identities can have the same user identifier and the same public key. + +```bash +silkaj -gt wot moul +| id | uid | pubkey | timestamp | +|------+-----------+--------------------------------------------------+-----------------------| +| 00 | moul1 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614118-00000EE8DFC0F… | +| 01 | moul2 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614227-00000ED689406… | +| 10 | moul1 | 3rp7ahDGeXqffBQTnENiXEFXYS7BRjYmS33NbgfCuDc8:DFQ | 614227-00000ED689406… | +| 20 | moul-test | 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK | 167750-0000A51FF952B… | +Which identity would you like to select (id)?: +``` + +## 3. Transactions: multi-recipients & different amounts of Äž1 +Thanks to Matograine, users can now send different amounts of Äž1 to multiple recipients in the same document. +Working on this feature offered us the opportunity to rethink and clean up the CLI and the code related to the `tx` command. +However, further efforts are required to build a more solid code base foundation. +<br /> + +v0.8.0 comes with three **breaking changes** and four small options: +- `--output` was renamed to `--recipient` +- recipients public key are splits with the option `--recipient` instead of a colon character. +- The public key's checksum separator `!` is being replaced by the colon. +- small options have been introduced: + - `-a/--amount` + - `-d/--amountUD` + - `-r/--recipient` + - `-c/--comment` +<br /> + +The follow examples illustrates the change operated on the CLI. +With the previous version of Silkaj, the following procedure was operated to send one unit to `pubkey1` and `pubkey2`: + +```bash +silkaj tx --amount 1 --output <pubkey>1!<checksum1>:<pubkey2>!<checksum2> +``` + +With the current version of Silkaj, the following procedures are operated to send one unit to `pubkey1` and two units to `pubkey2`: +```bash +silkaj tx --amount 1 --recipient <pubkey1>:<checksum1> --amount 2 --recipient <pubkey2>:<checksum2> +``` + +With small options: +```bash +silkaj tx -a 1 -r <pubkey1>:<checksum1> -a 2 -r <pubkey2>:<checksum2> +``` + +In the case one amount is passed, the same amount will be send to the passed recipients. The `--allSources` option is only working with one recipient. + +## 4. Display improvements for `tx` and `balance` +We merged the relative and absolute amounts into one cell. This applies to the cells: initial balance, total transaction amount, balance after the transaction, and individual amounts. + +To send a different amount of Äž1 to multi-recipient proceed following: +```bash +silkaj tx -d 1 -d 2 \ +-r CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7 \ +-r d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \ +-c "Test different amounts to two different recipients" +â•’â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•• +│ Initial balance (unit|relative) │ 2207757.83 ÄžTest | 145.63 UD ÄžTest │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ Total transaction amount (unit|relative) │ 45480.0 ÄžTest | 3.0 UD ÄžTest │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ Balance after transaction (unit|relative) │ 2162277.83 ÄžTest | 142.63 UD ÄžTest │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ From (pubkey) │ 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ From (id) │ moul-test │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ To (pubkey) │ CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:8Sj │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ To (id) │ Elois │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ Amount (unit|relative) │ 15160.0 ÄžTest | 1.0 UD ÄžTest │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ To (pubkey) │ d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ To (id) │ matograine-G1Test │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ Amount (unit|relative) │ 30320.0 ÄžTest | 2.0 UD ÄžTest │ +├────────────────────────────────────────────┼────────────────────────────────────────────────────┤ +│ Comment | Test different amounts to two different recipients │ +╘â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•› +Do you confirm sending this transaction? [yes/no]: +``` + +The balance of a given public key is now displayed in a table. Bellow you can find an example of such a display. + +```bash +silkaj balance 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8 +â•’â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•• +│ Balance of pubkey │ 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8:4VT │ +├─────────────────────────────────────┼──────────────────────────────────────────────────┤ +│ Blockchain (unit|relative) │ 94322.48 Äž1 | 9220.18 UD Äž1 │ +├─────────────────────────────────────┼──────────────────────────────────────────────────┤ +│ Pending transaction (unit|relative) │ 100.0 Äž1 | 9.78 UD Äž1 │ +├─────────────────────────────────────┼──────────────────────────────────────────────────┤ +│ Total amount (unit|relative) │ 94422.48 Äž1 | 9229.96 UD Äž1 │ +├─────────────────────────────────────┼──────────────────────────────────────────────────┤ +│ Total relative to M/N │ 13.35 x M/N │ +╘â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•› +``` + +## 5. Pubic key checksum display, verification, and checksum command +For security purposes, Silkaj now displays the checksum associated with the public key, and verifies it when passed to a command. +If a public key or an authentication method is passed to the newly introduced `checksum` command, the later generates the associated checksum to the public key. if a public key and a checksum are passed, Silkaj displays whether the checksum is valid or not. + +## 6. `verify` +We introduced the new `verify` command to check whether the signatures of the blocks of the blockchain are valid since there was a bug in the cryptography library of Duniter. +Cf [Forum topic](https://forum.duniter.org/t/duniter-utilise-une-ancienne-version-buggee-de-tweetnacl-que-faire/6633) and [Duniter ticket](https://git.duniter.org/nodes/typescript/duniter/-/issues/1390) + +To verify blocks proceed following: + +```bash +silkaj verify +Processing blocks verification [####################################] 100% +Within 0-342803 range, blocks with a wrong signature: 15144 31202 85448 87566 90830 109327 189835 199172 221274 253582 +``` + +## 7. Development Environment +### A. Poetry + +<img src="images/poetry-logo.svg" width="7%" alt="Poetry logo"> + +We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects. + +In comparison, [Poetry](https://python-poetry.org/) is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the `requirements.txt`, `setup.{py,cfg}`, `Pipenv` files. Poetry, however, supports the `pyproject.toml` file standardized by the Python project and is able to define the dependencies at once. + +If you would like to install Silkaj for development purposes, please follow [this tutorial](https://git.duniter.org/clients/python/silkaj/-/blob/dev/doc/install_poetry.md). You may also interested by checking the newly introduced [contribution process documentation `CONTRIBUTING.md`](https://git.duniter.org/clients/python/silkaj/-/blob/dev/CONTRIBUTING.md). + +### B. Automatic container generation +We set up an [automated pipeline to generate containers](https://git.duniter.org/docker/python3/poetry/) for all supported Python versions: 3.5, 3.6, 3.7, and 3.8. These containers are based on official Python containers, which use Debian Buster Slim. On top of that, Poetry, `libsodium`, and other development tools are installed to continually check and test Silkaj in its pipeline. Since DuniterPy uses the same containers, it also profits from this automated container generation. + +### C. CI/CD pipelines +Based on the containers set out above, a continuous integration and delivery pipeline has been set up to automatically run: +- Checks: format, build, +- Tests on all supported Python versions, +- Release publication automation on PyPI and PyPI test. + + + +## 7. Tests +We started to write tests to ensure that all features of Silkaj are still functional when changing the code. +However, in order to have all Silkaj commands fully tested, further efforts are required. +During this development cycle, the test coverage raised from 37% to 69% and Silkaj is now covered by more than hundred tests. + +## Outlook +Silkaj is compatible with a range of Python versions. Currently, it can be used with Python 3.5, 3.6, 3.7, and 3.8. v0.8.x will be the last releases with Python 3.5 support. In v0.9.0, we will support Python 3.6, 3.7, 3.8, and 3.9. + +Since there is a deadline for packaging Silkaj and DuniterPy into Debian Bullseye (v11), we are putting all our efforts into the upcoming packaging. As for the coming version, DeathReaper, the `excluded` command, for which the crowdfunding has been completed, and the newly revamped `info` command will be stabilized and automatic tests will be written. + +@ManUtopiK revamped the [website of Silkaj](https://mystifying-nobel-66ae54.netlify.app) in which you can look up all the presentations, the major features and documentations related to Silkaj. We are working on integrating the website into the project. + +For further details check out the presentations of the [RML14](https://rml14.monnaielibreoccitanie.org/). The oral presentations are in French and the slides in English: +- [Moul's: How to contribute to Silkaj](https://git.duniter.org/moul/slides/#rml14-toulouse-28th-november-2019) +- [Matograine's: Envoyer des transactions exotiques avec Silkaj](https://www.youtube.com/watch?v=Fbwy5ovEkSg) + +### Thanks +@moul, @matograine -- GitLab