【更新】ステーキング最新情報
How we use Nix at IOHK

IOHKがNixOS(Linux)を使う理由

2019年2月6日、
IOHKの公式ブログが更新された。

内容は以下の通りである。

【注意喚起】ステーキング前の心構え

IOHKでのNixOSの使い方

IOHKでのNixOSの使い方
公式ブログ:How we use Nix at IOHK
英語版を読む方は ↑
投稿者:Rodney Lorrimar氏(IOHK DevOps エンジニア)

和訳文章 まとめ

※Google翻訳 全文

スマホユーザー向けに

まとめております。
多少の誤変換にはご了承ください。

IOHKはすばらしい研究を実践してきた歴史があります。

これには関数型プログラミング言語の使用、
形式的手法の採用、そしてもちろん
私たち自身の査読付き研究を
ブロックチェーン合意アルゴリズムに
実装することが含まれます。

最近の学術研究から生まれた
アイデアを使用して、
私たちは同様の方法で
ソフトウェア展開の問題に取り組みます。

このシステムは、
ソフトウェアパッケージ管理と
システム管理の分野に
関数型プログラミングの原則を適用します。

この短い技術記事では、
IOHKでNixをどのように活用しているかを説明し、
今後の計画について説明します。

Nix,Nixpkgs、およびNixOSとは何ですか?

NixOSは、
Nixパッケージマネージャ上に構築された
Linuxディストリビューションです。

私が個人的に
Nixのパッケージマネージャを
気に入っているのは、
同じパッケージの
複数のバージョンをインストールしたり、
パッケージにソースコードの修正を
簡単に適用したりできることです。

特にHaskell開発のために、
印象的な数のコンパイラ、ツール、
および利用可能なHackageパッケージのための
バイナリパッケージがあります。

NixOSと一線を画すのは、
その設定システムです。

それは一様な方法で宣言的に設定されている
高品質のモジュールの
大規模なコレクションを含みます。

これは、
同じ設定を多数のシステムに適用したり、
さまざまなソフトウェアを
1つのシステムに統合したりする必要がある
システム管理者にとっては有益なことです。

Nixパッケージマネージャと
NixOSの下にはNix言語があります。

これは、ドメイン固有の、
純粋に機能的で、怠惰に評価された
ソフトウェアの設定と展開のための言語です。

論文NixOS
純粋に機能的なLinuxディストリビューションは
すばらしい紹介です。

NixOSが解決しようとしている
問題を明確に示していますが、
その多くは技術ユーザーには
おなじみのものでしょう。

NixOSプロジェクトの背後にいるのは誰ですか?

NixOSは、
2003年にUtrecht大学で
Eelco Dolstraの研究プロジェクトとして創設され、
博士論文の主要部分を形成しました。

15年後、
NixOSプロジェクトは
何百人もの貢献者と共にGitHub上で実行されており、
コードベースは現在、
毎週約500 gitコミットの割合で改善されています。

またコミュニティは
Freenode上の活発なIRCチャンネル、
ディスカッション掲示板、(およそ)年次会議、
そして定期的なミートアップを通して
コミュニケーションをとります。

さらに、
Tweag I / OやMayflowerなど、
いくつかの会社が
Nixコンサルティングサービスを
提供しています。

なぜNixなのか?

ソフトウェア構成管理のための
既存のシステムは多数ありますが、
中にはNixよりはるかに多くのユーザーを
持つものもあります。

ただし、機能だけでなく、
その設計と可能性の面でも、
Nixは
「コードとしてのインフラストラクチャ」を
最もよく利用できる実装であると考えています。

配備を関数型言語で書かれた
プログラムとして扱う場合は、
参照透過性、安全なコードの再利用、
配備を単体テストする機能など、
関数型プログラミングの利点が得られます。

その核となるのは、
Nixの「派生」が細部を抽象化し、
ソース言語に関係なく、
ほぼ同じ方法でソフトウェアモジュールを
構築して使用できるようにすることです。

派生は、
ソースコード、ビルドツール、
およびライブラリの依存関係を取得し、
不変のソフトウェアパッケージを
作成する関数です。

Nixは
(関数型プログラミングの意味で)純粋であるため、
入力のいずれかが変更されると、
結果は異なるソフトウェアパッケージになります。

あるいは、
(例えば、継続的インテグレーション(CI)によって)
まったく同じ入力の派生が
すでに他の場所に構築されている場合、
Nixは派生自体を構築するのではなく、
単にそのパッケージをダウンロードし、
作業の重複を減らします。

Nixが派生入力が変更されたかどうかを計算する方法は、
その暗号ハッシュを使用することです。

依存関係は再帰的なので、
このハッシュは実際にはハッシュのハッシュです。

ブロックチェーン愛好家には
すぐにわかる強力な概念です。

Nixの使い方

これが、IOHKでNixを使用している例です。

1.カルダノSLネットワークの展開

さまざまなテストネット、
Cardano SL Byronメインネット、
およびCardano SLステージングデプロイメント
(アップグレードのテストに使用される環境)に対して、
AWSで約200のコンピューティングノードを実行します。

これらはすべてNixOpsと一緒に展開された
NixOSシステムです。

抽象的なトポロジ記述から
NixOpsネットワークを生成する
iohk-opsというツールを書きました。

トポロジの説明には、
Cardano SLリレーノードの数、
それらがホストされているデータセンター、
およびピア間のスタティックルートが
記述されています。

iohk-opsはNixOpsを呼び出して展開を実行します。

同じツールを使用して、
アクティビティのテストに使用される
小さな「開発者クラスタ」をデプロイできます。

これらのクラスタは、
同じ展開コードと
同一のソフトウェアバージョンを
共有しますが、サイズは小さく、
必要に応じて起動および停止できます。

NixOSとNixOpsのロールバック機能は、
当社のステージング展開ですでに数回かけて
非常に貴重なものとなっています。

ネットワーク全体を
単一のコマンドまたは特定のノードだけで
再展開できます。

NixOpsを使えば、
設定の微調整やコードパッチを適用してから
展開時に再構築することができます。

その結果はCIから得られるものと同じになり、
混乱を招くことなく元に戻すことができます。

2.再現可能な展開

デプロイ時のコード変更などの
極端な対策は通常必要ありません。

デプロイ環境を再現して
ローカルでテストすることができ、
問題が発生する前に確実に捕捉できるからです。

前述のように、
Nixの導出は純粋な関数です。

このコードは、
本番環境で使用されているものと
まったく同じ環境およびライブラリ
(Linuxカーネルまで)を使用して
ローカルに実行できます。

3.Dockerイメージの高速再構築

Dockerの強みには、
その不変性、カプセル化、および再現性、
Nixが共有する特性などがあります。

ただし、
それはそのデータモデルと制限された
DSLによって厳しく制限されています。

ソフトウェアの依存関係の構造はツリーであり、
Dockerによってモデル化された一連の層ではありません。

Dockerfileを使って
Dockerイメージを
構築するときの典型的な煩わしさは、
一番下の近くのレイヤーが変更された場合、
上記のすべてを再構築する必要が
あるということです。

さらに、
複数のビルドステージを使用するための
手順を実行しない限り、
下層からの中間ビルド製品が最終イメージに含まれます。

対照的に、
Nixパッケージはその依存関係
(あるいはそれらの依存関係)が変更された場合にのみ
再構築されます。

Nixパッケージの最小閉鎖には、
そのソフトウェアを実行するために必要なものだけが
含まれています。

したがって、
最小限で再構築が速いNix派生のクロージャから
Dockerイメージを生成できます。
ビルドプロセスは、
Nix言語の関数として定義することで
パラメータ化することもできます。

4.macOSビルドスレーブの宣言的展開

Daedalus(ダイダロス)の
macOSインストーラパッケージを作成するために、
私たちは(MacinCloudによってホストされている)
macOSシステムの小さなコレクションを保守しています。

これらのシステムは、
Nix-darwinを使い始めるまでは非常に面倒です。

Nix-darwinは、
NixOSと同様の方法でmacOSシステムの
宣言型設定を可能にします。

私たちはSSHを通して
Macをセットアップするためのスクリプトを書きました。

ビルド環境、モニタリング、SSHアクセスなど、
すべてがNixコードを介して管理されます。

5.Windows用のCardano SLのクロスコンパイル

Daedalusの
Windowsインストーラパッケージを作成するには、
リソースが限られている
CIプロバイダのビルドインスタンスに頼るか、
Windowsシステムの小さなコレクションを
保守する必要がありました。

Windows CIインフラストラクチャは、
私たちにとって常に問題の原因となっています。

しかし、
Linux上のWindows用の
Haskellコードを
クロスコンパイルすることができます。

Windows用の
Daedalusの次のメジャーバージョンは、
Linux上のNixで構築された
cardano-node.exeで出荷されます。

Cardano SLのサイズのおかげで、
これはかなりの成果であり、
数ヶ月にわたる努力の結果です。

6.開発環境

nix-shellを使用すると、
正確に定義されたバージョンに固定された、
プロジェクトの構築に必要なすべてのツールと
ライブラリを含む開発環境を提供できます。

cardano-slでは、
Nixシェルはスタックワークフロー、
またはIOHKバイナリキャッシュからダウンロードされた
Haskellの事前に構築された依存関係を持つ
cabal new-buildのいずれかをサポートします。

daedalusでは、Nixシェルが糸を提供し、
Cardano SLブロックチェーンと
財布をローカルで実行する方法を提供します。

Cabal、Stack(Haskell)、
NPM、Yarn(Javascript)、
またはCargo(Rust)などの他の言語の
ビルドツールに慣れていない開発者およびユーザーは、
再ビルド
(またはCIからキャッシュビルドをダウンロード)
することができます。

Nix buildを実行するだけです。

Apache MavenやDockerなど、
再現可能な開発環境を提供するためのツールは
他にもありますが、
これらは簡単には構成できません。

Nixは機能的言語であるため、
開発環境は機能の応用であり、
それを構成することができます。

Nixを使えば、開発環境、
あるいは必要な部分だけを
組み合わせた関数を書くことができます。

今後の方向性

2019年は、
いくつかの野心的なプロジェクトが進行中で、
IOHKにとってエキサイティングな年になるでしょう。

これらのプロジェクトの成功には、
Nixが大きな役割を果たすことを期待しています。

私たちが計画していることの
いくつかは以下のとおりです。

純粋なDaedalusビルド

現在、
Haskellスクリプトを使用して
WindowsとmacOS用のDaedalusインストーラーを
構築しています。

これは必要以上に遅く、
WindowsまたはmacOSシステム上で
実行する必要があります。

必要に応じてソフトウェアコンポーネントを
キャッシュできるように、
LinuxをNixと共に構築することをお勧めします。

IOHK-Nix

IOHKはCardano SLコードベースを
独立したモジュールに分割しています。

これらのモジュールは
最終製品ビルドに統合する必要があります。

各Cardano SLサブプロジェクトで
再利用可能な共通のNixコードiohk-nixのリポジトリを
開始しました。

すべての言語と同様に、
Nixコードは美しく
またはひどい方法で書くことができます。

そしてNixは静的型システムを持っていないので、
ひどいコードは本当に悪いです。

そのため、このプロジェクトの一部は、
理解と保守が容易になるように、
Nixコードの読みやすさと文書化を改善することです。

ノードまたはステークプールをデプロイするためのツール

2019年に、
カルダノSLは分散化されるでしょう。

テクニカルユーザーが
1つまたは複数のCardano SLノードを展開したり、
ステークプールを操作したりするのを
非常に簡単にしたいと思います。

これには以下が含まれます。

・iohk-opsのざらざらした部分を滑らかにして、
一般の人々が使えるようにします。

・Dockerイメージや完全に静的にリンクされた
実行可能ファイルなど、
さまざまなビルドオプションを提供します。

・NixOSで利用可能なツールを使用して、
必要なすべてのアプリケーションレベルのメトリックに
対するターンキー監視設定を提供します。

Nix-tools Haskellビルダー

Nix Haskellビルドインフラストラクチャは、
Haskellを
ターゲットWindowsにクロスコンパイルするために、
主にコンパイラフラグと依存関係に関する
より多くの情報を追跡するために、
いくつかの重要な手直しを必要としました。

その結果、より強力なHaskellビルダーと、
とりわけ速く実行される
stack2nixの新しい実装が得られます。

このHaskellビルド基盤は
nix-toolsと呼ばれています。

私たちは、来年中に不足している部分を埋め、
それをNixpkgsに送ることを目指しています。

この話題はとても興味深いので、
それはそれ自身のブログ投稿に値する、
我々がまもなく投稿するのを楽しみにしている。

結論

これは、
Cardanoの開発と導入を支援するために
Nixをどのように使用するかを
簡単に説明したものです。

もちろんすべてが優れているわけではありません。

ユーザーは、
Nixの学習曲線が急勾配であること、
そしてコミュニティが
比較的小規模であることを知りました。

まだ実装されていない
Nixのための機能とバグ修正の
私達自身のウィッシュリストもあります。

Nixについてもっと知りたい場合は、
NixOSのWebサイトにアクセスしてください。

コーディングやシステム管理が好きなら、
NixOSプロジェクトに参加するのは
とても簡単です。

Nix言語に慣れるのに少し時間がかかりますが、
それからあなたが知る必要があるほとんどすべてが
単一のgitリポジトリにあることがわかります。

IOHKでは、
定期的にNixOSプロジェクトに貢献しています。

これらの貢献はパッケージと
NixOSモジュールへの改善、
そしてより大きな改善をするために
開発者と契約することを含みます。

さらに、研究および商業プロジェクトで
大規模にNixOSを使用するだけで、
私たちは無料ライセンスの下で
ソースコードを公開する、
バグレポートを提出する、
またはコミュニティと私たちの経験を
共有することによって、
エコシステムに貢献します。

私達は雇っています

IOHKチームは成長しています、
そして、私たちは私たちに加わるための
適切な人々を探しています。

他に比べて高度な
ブロックチェーンプラットフォームの開発を
手助けすることがあなたの興味を引くものである場合は、
当社の求人情報をチェックして、
連絡を取ってください。
求人情報:コチラ
引用元:How we use Nix at IOHK

Twitterアカウント

Official Twitter Account

【正規品】最安値をチェック
クロスエクスチェンジ毎日配当5
TREZOR Model T
カルダノ(ADA)を拡散中!

皆様で、リツイートして
カルダノ(ADA)を広めていきましょう。

Twitterでフォローしよう

おすすめの記事