From c917d5ff6e5187d77dcb662f5a5ae6a891861595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 19:55:58 +0900 Subject: [PATCH 1/8] ci: add review --- .github/workflows/textlint.yaml | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/textlint.yaml diff --git a/.github/workflows/textlint.yaml b/.github/workflows/textlint.yaml new file mode 100644 index 0000000..0ddf867 --- /dev/null +++ b/.github/workflows/textlint.yaml @@ -0,0 +1,38 @@ +name: reviewdog +on: [pull_request] +jobs: + textlint: + name: textlint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: true + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + - name: textlint-github-pr-check + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + textlint_flags: "*/*.md" + - name: textlint-github-check + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-check + textlint_flags: "*/*.md" + - name: textlint-github-pr-review + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + textlint_flags: "*/*.md" From 91e853b425dd2b60a6fbf1200d86db530d522edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 19:57:22 +0900 Subject: [PATCH 2/8] chore: add packagemanager version --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d287db..a67d020 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,6 @@ "textlint-rule-period-in-list-item": "^1.0.1", "textlint-rule-preset-ja-technical-writing": "^10.0.1", "textlint-rule-prh": "^6.0.0" - } + }, + "packageManager": "pnpm@9.5.0+sha1.8c155dc114e1689d18937974f6571e0ceee66f1d" } From 151147e8c99255c6e5090d4fd8e7a9082c84e851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:04:29 +0900 Subject: [PATCH 3/8] ci: push action --- .github/workflows/textlint-reviewdog.yaml | 38 +++++++++++++++++++++++ .github/workflows/textlint.yaml | 24 +++----------- 2 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/textlint-reviewdog.yaml diff --git a/.github/workflows/textlint-reviewdog.yaml b/.github/workflows/textlint-reviewdog.yaml new file mode 100644 index 0000000..0ddf867 --- /dev/null +++ b/.github/workflows/textlint-reviewdog.yaml @@ -0,0 +1,38 @@ +name: reviewdog +on: [pull_request] +jobs: + textlint: + name: textlint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: true + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + - name: textlint-github-pr-check + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + textlint_flags: "*/*.md" + - name: textlint-github-check + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-check + textlint_flags: "*/*.md" + - name: textlint-github-pr-review + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + textlint_flags: "*/*.md" diff --git a/.github/workflows/textlint.yaml b/.github/workflows/textlint.yaml index 0ddf867..f49677c 100644 --- a/.github/workflows/textlint.yaml +++ b/.github/workflows/textlint.yaml @@ -1,5 +1,5 @@ -name: reviewdog -on: [pull_request] +name: textlint +on: [push] jobs: textlint: name: textlint @@ -18,21 +18,5 @@ jobs: with: node-version: 20 cache: 'pnpm' - - name: textlint-github-pr-check - uses: tsuyoshicho/action-textlint@v3 - with: - github_token: ${{ secrets.github_token }} - reporter: github-pr-check - textlint_flags: "*/*.md" - - name: textlint-github-check - uses: tsuyoshicho/action-textlint@v3 - with: - github_token: ${{ secrets.github_token }} - reporter: github-check - textlint_flags: "*/*.md" - - name: textlint-github-pr-review - uses: tsuyoshicho/action-textlint@v3 - with: - github_token: ${{ secrets.github_token }} - reporter: github-pr-review - textlint_flags: "*/*.md" + - name: Run lint + run: pnpm lint From c933e3c28381f424e0ddaec60550d105186c975f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:05:02 +0900 Subject: [PATCH 4/8] test: fail --- object-storage/01-what-is-object-storage.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/object-storage/01-what-is-object-storage.md b/object-storage/01-what-is-object-storage.md index e25fa2b..6d5c9de 100644 --- a/object-storage/01-what-is-object-storage.md +++ b/object-storage/01-what-is-object-storage.md @@ -9,7 +9,7 @@ Object-Storageは非ユーザー依存データを保存する役割を担当し ## 自動的なレプリケーション -非ユーザー依存データは、自動的に選択された複数箇所のObject-Storageコンポーネントへ保管されます。 +非ユーザー依存データは、自動的に選択された複数箇所のObject-storageコンポーネントへ保管されます。 データを保管しているBloomが何かしらの理由で停止した場合、Suteraネットワークは同じデータを持っている他のBloomから別のBloomへデータをコピーします。 このように、Suteraネットワークではデータが常に一定数の複製を保つように運用されています。 @@ -21,3 +21,4 @@ Object-Storageは非ユーザー依存データを保存する役割を担当し 自動的なレプリケーションでのデータロストのリスクに備え、非ユーザー依存のデータはBloomを指定してコピーすることもできます。 例えば、思い出深いワールドは自分でホストするBloomでも保管しておくことができます。 + From 20058e0c1d3897247f775655b411a0338e0feb10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:08:11 +0900 Subject: [PATCH 5/8] ci: add review permission --- .github/workflows/textlint-reviewdog.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/textlint-reviewdog.yaml b/.github/workflows/textlint-reviewdog.yaml index 0ddf867..414b5e6 100644 --- a/.github/workflows/textlint-reviewdog.yaml +++ b/.github/workflows/textlint-reviewdog.yaml @@ -4,6 +4,9 @@ jobs: textlint: name: textlint runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write steps: - name: Checkout uses: actions/checkout@v4 From 50f6120e6a1242608525a49e801550a9245454bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:11:18 +0900 Subject: [PATCH 6/8] ci: fail-on-error --- .github/workflows/textlint-reviewdog.yaml | 13 +++++++------ .github/workflows/textlint.yaml | 5 ++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/textlint-reviewdog.yaml b/.github/workflows/textlint-reviewdog.yaml index 414b5e6..268a08f 100644 --- a/.github/workflows/textlint-reviewdog.yaml +++ b/.github/workflows/textlint-reviewdog.yaml @@ -21,12 +21,6 @@ jobs: with: node-version: 20 cache: 'pnpm' - - name: textlint-github-pr-check - uses: tsuyoshicho/action-textlint@v3 - with: - github_token: ${{ secrets.github_token }} - reporter: github-pr-check - textlint_flags: "*/*.md" - name: textlint-github-check uses: tsuyoshicho/action-textlint@v3 with: @@ -39,3 +33,10 @@ jobs: github_token: ${{ secrets.github_token }} reporter: github-pr-review textlint_flags: "*/*.md" + - name: textlint-github-pr-check + uses: tsuyoshicho/action-textlint@v3 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + textlint_flags: "*/*.md" + fail_on_error: true diff --git a/.github/workflows/textlint.yaml b/.github/workflows/textlint.yaml index f49677c..f8e1f27 100644 --- a/.github/workflows/textlint.yaml +++ b/.github/workflows/textlint.yaml @@ -1,5 +1,8 @@ name: textlint -on: [push] +on: + push: + branches: + - main jobs: textlint: name: textlint From 7eba7fa9533b170199cc8e7a243ac1aee8bca4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:15:06 +0900 Subject: [PATCH 7/8] Revert "test: fail" This reverts commit c933e3c28381f424e0ddaec60550d105186c975f. --- object-storage/01-what-is-object-storage.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/object-storage/01-what-is-object-storage.md b/object-storage/01-what-is-object-storage.md index 6d5c9de..e25fa2b 100644 --- a/object-storage/01-what-is-object-storage.md +++ b/object-storage/01-what-is-object-storage.md @@ -9,7 +9,7 @@ Object-Storageは非ユーザー依存データを保存する役割を担当し ## 自動的なレプリケーション -非ユーザー依存データは、自動的に選択された複数箇所のObject-storageコンポーネントへ保管されます。 +非ユーザー依存データは、自動的に選択された複数箇所のObject-Storageコンポーネントへ保管されます。 データを保管しているBloomが何かしらの理由で停止した場合、Suteraネットワークは同じデータを持っている他のBloomから別のBloomへデータをコピーします。 このように、Suteraネットワークではデータが常に一定数の複製を保つように運用されています。 @@ -21,4 +21,3 @@ Object-Storageは非ユーザー依存データを保存する役割を担当し 自動的なレプリケーションでのデータロストのリスクに備え、非ユーザー依存のデータはBloomを指定してコピーすることもできます。 例えば、思い出深いワールドは自分でホストするBloomでも保管しておくことができます。 - From 1975bbad7684bd1f012b7dc100eb375e21985c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AsPulse=20/=20=E3=81=82=E3=81=99=E3=81=B1=E3=82=8B?= Date: Thu, 18 Jul 2024 20:30:08 +0900 Subject: [PATCH 8/8] fix: textlints --- object-storage/01-what-is-object-storage.md | 4 +--- ...Why-sutera-need-to-maintain-idempotence.md | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/object-storage/01-what-is-object-storage.md b/object-storage/01-what-is-object-storage.md index e25fa2b..88a30b2 100644 --- a/object-storage/01-what-is-object-storage.md +++ b/object-storage/01-what-is-object-storage.md @@ -17,7 +17,5 @@ Object-Storageは非ユーザー依存データを保存する役割を担当し ## 指定したレプリケーションへのバックアップ - -自動的なレプリケーションでのデータロストのリスクに備え、非ユーザー依存のデータはBloomを指定してコピーすることもできます。 - +自動的なレプリケーションでのデータロストのリスクに備え、非ユーザー依存のデータはBloomを指定してコピーできます。 例えば、思い出深いワールドは自分でホストするBloomでも保管しておくことができます。 diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md index 82b118e..93e8757 100644 --- a/sutera/11-Why-sutera-need-to-maintain-idempotence.md +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -1,29 +1,31 @@ # なぜSuteraネットワーク内の通信には羃等性が必要なのか ## 概要 -Suteraネットワークでは多くのコンポーネントが情報を保持・中継する上、認証を行う中央サーバーが存在しません。そのため、電子署名以外にリクエストの正当性を保つ手段をもちません。 +Suteraネットワークでは多くのコンポーネントが情報を保持・中継するうえ、認証を担う中央サーバーが存在しません。そのため、電子署名以外にリクエストの正当性を保つ手段をもちません。 しかし、まったく内容の同じリクエストならば電子署名を使い回すことが可能であり、リプレイ攻撃[^1]などが成立します。 Suteraネットワークでは、このような任意のタイミングで過去のメッセージが送信されることによる悪意ある攻撃に耐性を持つことが必要です。この耐性を確保するために、すべての通信仕様で冪等性を保つ必要があります。 ## 冪等性とは -情報工学において冪等性(べきとうせい、英: idempotence)とは、ある操作を一度行っても複数回行っても同じ結果となることです。 +情報工学において冪等性(べきとうせい、英: idempotence)とは、ある操作を一度行っても、複数回行っても同じ結果となることを指します。 特に何回実行しても内部状態が変わらない操作を指します。[^3] 冪等性の例として動画プレイヤーの一時停止ボタンを考えてみましょう。 ある動画プレイヤーに一時停止ボタンが有り、そのボタンを押すたびに一時停止と再生が切り替わると仮定します。この場合では、「一時停止ボタンを押す」という同じ操作を複数回行うたびに応内部状態が変わるため、冪等性はないと言えます。 -次に一時停止ボタンと再生ボタンが分かれている場合を仮定します。この場合は一時停止ボタンを複数回押しても動画は停止したままであり、複数回同じ操作を行っても内部状態が変わらない、すなわち冪等性が保たれていると言えます。 +次に一時停止ボタンと再生ボタンが分かれている場合を仮定します。この場合は一時停止ボタンを複数回押しても動画は停止したままであり、複数回同じ操作をしても内部状態が変わらない、すなわち冪等性が保たれていると言えます。 ## 冪等性がない場合 Suteraネットワーク内で頻繁に行われる「特定のユーザーが保持しているファイルの内容更新」を例に、リプレイ攻撃が有効となるような通信仕様を考えてみましょう。 -以下の図が冪等性がない場合の例です。この場合では最初にある人物Aが電子署名を付加したファイルを送信し、その後にAがそのファイルを更新して再び送信したと仮定します。 -ここで一番最初に送信した電子署名付きのファイルを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバ側はこの更新を正常なものとして処理します。 +以下の図は、冪等性がない場合の例です。この場合では最初にある人物Aが電子署名を付加したファイルを送信し、その後にAがそのファイルを更新して再び送信したと仮定します。 +ここで一番最初に送信した電子署名付きのファイルを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバー側はこの更新を正常なものとして処理します。 このように、電子署名だけでは同じファイルの送信を複数回行っても正常に処理してしまうため冪等性がないと言えます。 ![figure of discription unidempotence](image/unidempotence.drawio.png) ## 冪等性がある場合 -冪等性がある場合の例が以下の図です。Suteraネットワークでは冪等性を保つために電子署名にバージョン情報を追加しています。 -この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信し、その後に更新しています。しかし、この例では先程の例ではなかったバージョン情報が電子署名に追加されています。そのため、悪意のある第三者からリプレイ攻撃を行われていてもバージョン情報の整合性が取れず、サーバでの処理が拒否されます。 +冪等性がある場合の例が以下の図です。Suteraネットワークでは冪等性を保つため、電子署名にバージョン情報を追加しています。 +この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信し、その後に更新しています。しかし、この例では先程の例ではなかったバージョン情報が電子署名に追加されています。そのため、悪意のある第三者がリプレイ攻撃をしてもバージョン情報の整合性が取れず、サーバーでの処理が拒否されます。 このように、電子署名にバージョン情報を追加することで、同じ通信が複数回送信されても過去のバージョンに対する通信であることを認識でき、現在の状態を変更することはないため、冪等性が保たれていると言えます。 ![figure of discription idepotence](image/idempotence.drawio.png) ## 参考文献、脚注 + [^1]: リプレイ攻撃とは標的が送信した情報を入手し、その情報を再送信することで不正なアクセスを実現する攻撃手法です。 [^2] -[^2]:リプレイ攻撃、SOMPO CYBER SECURITY サイバーセキュリティ用語集,閲覧2024-07-15, https://www.sompocybersecurity.com/column/glossary/replay-attack -[^3]:冪等性,デジタル大辞泉,ジャパンナレッジ,閲覧2024-07-13,https://japanknowledge.com/library/ \ No newline at end of file +[^2]: リプレイ攻撃、SOMPO CYBER SECURITY サイバーセキュリティ用語集,閲覧2024-07-15, https://www.sompocybersecurity.com/column/glossary/replay-attack +[^3]: 冪等性,デジタル大辞泉,ジャパンナレッジ,閲覧2024-07-13,https://japanknowledge.com/library/ +