# ブロックチェーン・ライブラリ・スイート

[English](README.md)

## 20250318までに完成した事

Linuxプラットフォームへの対応が完了しました。ただし、ノンス計算には対応していません。

ソースコードはLinuxとiOSで共通です。(Swift Code)

動作させるにはSwift環境をインストールする必要があります。[download](https://www.swift.org/install/linux/#platforms)

 

ブートノードが公開ネットワークで動作し始めました。

BlockChain LibraryはネームサーバーのTXTレコードからブートノードを見つけ出します。

ただし、インフラが貧弱なためブートノードはメモリ不足で停止する場合があります。

シグナリングサーバー(NAT横断のためのTCPホールパンチング)が公開ネットワーク上で動作しています。

BlockChain LibraryはネームサーバーのTXTレコードからシグナリングサーバーを見つけ出します。

## 私たちのゴール

中央銀行/政府/企業が発行したお金(硬貨、紙幣、クレジット、デビッド、プリペイド)の代わりに、システム(言い換えれば、自律インテリジェンス)によって発行されるポイント* で生活する社会をめざします。
このポイントは中央銀行や政府が発行する通貨と兌換(双方向に交換/譲渡/売買/貸借)できません。

*ブロックチェーンで管理されるポイント

 

このシステムを管理するスーパーユーザは存在しません。言い換えれば、参加者全員で管理するのです。

 

ブロックチェーンで管理されるポイントはモノやサービスのやり取りに使われます。

 

このポイントを得るために働く必要はありません。

要求に応じて、毎月ポイントが発行されます。

 

## blocks

blocks は中本智さんの論文に基づいて開発されたiOS/Linuxライブラリです。 あなたのアプリにブロックチェーンを導入できます。

 

いろんな目的に使用できますが、仮想通貨取引所で交換可能な暗号資産として使用することを禁止します。

 

このブロックチェーン・ライブラリが特徴的なのは、政府・公共・民間の社会システムにおける活動をあらかじめ組み込まれていることです。(出生証明、住民票、身元保証など)

添付の overlayNetwork ライブラリに依存します。

 

## overlayNetwork

overlayNetwork は、Peer-to-Peerオーバーレイ・ネットワーク通信システムです。 MIT Laboratoryの分散ハッシュテーブルの実装である Chord 論文に基づいて開発されたものです。

 

NAT越え(TCPホールパンチング)により他のノードと通信します。

 

POSIX select() システムコールにより多重化通信を実現しています。(Swift Code)

 

他のライブラリに依存しません。

 

## Testy

Testy は住民基本台帳カードの代替として開発されています。

blocksライブラリとoverlayNetworkライブラリの使用参考例として作成されたiOS/Linuxアプリです。

 

## Signaling

Signalingはオーバーレイネットワークにおいて、NATトラバースを用い、オーバーレイネットワークアドレスをIP/ポートに変換することで、ノード間の通信をコーディネートします。

Signalingはクラウド上で動作し、ノードの要求に応じ、通信調整を行います。

Signalingはオーバーレイネットワークにおいて、NAT越え(TCPホールパンチング)により他のノードと通信します。

 

POSIX select() システムコールにより多重化通信を実現しています。(Swift Code)

 

## download

blocks - ブロックチェーン・ライブラリ
[ダウンロード](https://github.com/webbananaunite/blocks)
https://github.com/webbananaunite/blocks

 

overlayNetwork - peer-to-peer分散ハッシュテーブル通信ライブラリ NAT越え(TCPホールパンチング)
[ダウンロード](https://github.com/webbananaunite/overlayNetwork)
https://github.com/webbananaunite/overlayNetwork

 

Testy - 住民基本台帳アプリ
[ダウンロード](https://github.com/webbananaunite/Testy)
https://github.com/webbananaunite/Testy

 

Signaling - オーバーレイネットワークアドレスをIP/ポートに変換 NAT越え(TCPホールパンチング)
[ダウンロード](https://github.com/webbananaunite/Signaling)
https://github.com/webbananaunite/Signaling

 

## Linuxアプリとしてのビルド方法 ー Swift Linux Static Libraryを用いてmacOS上でのクロスコンパイル

0) Linux用プロジェクトを開くには、Testy/Package.swiftをXcodeで開きます。Testy/Testy.xcodeprojではなく。
1) Swiftコンパイラーをダウンロード、インストール
[download](https://www.swift.org/install/macos/).
ex. swift-6.0.3-RELEASE-osx.pkg
2) TOOLCHAINS環境変数に定義するためのツールチェーン定義を抽出


$ plutil -extract CFBundleIdentifier raw /Library/Developer/Toolchains/swift-6.0.3-RELEASE.xctoolchain/Info.plist 
org.swift.603202412101a

3) Static Linux SDK for Swiftをインストール cf. [https://www.swift.org/documentation/articles/static-linux-getting-started.html]


$ TOOLCHAINS=org.swift.603202412101a swift sdk install ~/Downloads/swift-6.0.3-RELEASE_static-linux-0.0.1.artifactbundle.tar.gz

4) Linuxアプリとしてクロスコンパイル


$ cd ~/Documents/block\ chain/Testy
$ TOOLCHAINS=org.swift.603202412101a swift build -v --swift-sdk x86_64-swift-linux-musl --build-path ~/appOutput/Testy

5) 実行ファイルをLinuxにコピー

ex.

$ scp -i {your key file} ~/appOutput/Testy/x86_64-swift-linux-musl/debug/TestyOnLinux {target user}@{target host name}:{target path}

6) Linux Distributionごとにターゲット環境を構築
[download](https://www.swift.org/install/linux/#platforms)

ex.

$ wget https://download.swift.org/swift-6.0.3-release/ubi9/swift-6.0.3-RELEASE/swift-6.0.3-RELEASE-ubi9.tar.gz
$ tar -xzf swift-6.0.3-RELEASE-ubi9.tar.gz
$ vi .bashrc
export PATH=~/swift-6.0.3-RELEASE-ubi9/usr/bin:"${PATH}"

7) Run App on shell.


$ lldb TestyLinux

 

## XcodeでiOSアプリとしてビルドする方法

### Swift Package ( 推奨 )

1) XcodeでTestyプロジェクトまたはあなたのアプリを開きます。
2) File - Add Packages
3) 右上のSearch or Enter Package URLに次のblocks URLを入力します。
https://github.com/webbananaunite/blocks
4) blocks libraryのREADME.mdが表示されます。
5) 右下のAdd Packageボタンをタップします。
6) TestyプロジェクトまたはあなたのアプリのプロジェクトのFrameworks, Libraries and Embeded Contentにblocks libraryがあることを確認します。
7) TestyプロジェクトまたはあなたのアプリのプロジェクトのProject NavigatorのPackage Dependenciesにブロックチェーン・ライブラリ・スイート(blocks and overlayNetwork libraries)があることを確認します。
8) 最初の一台は、ブートノードとして起動する必要があります。 アプリをブートノードとして起動するためには、XcodeのEdit Scheme から RunAsBootNode という名称で Run Argument / Environment Variable のどちらかを設定します。
9) Xcodeでビルド、デバイスやシミュレータへのインストールを行います。
10) アプリを起動し、"Join blocks Network"ボタンをタップすることで、稼働中のSignaling Serverとの通信を開始します。
11) DHCテーブルの初期化が完了するまで8分ほど待ちます。(初回起動時のみ)

### Carthage (0.3.0以降には対応していません。Swift Packageを使用してください。)

- $ cd your project directory
- $ echo 'github "webbananaunite/blocks" "carthage"' > Cartfile
- $ carthage update --use-xcframeworks

### CocoaPods (0.3.0以降には対応していません。Swift Packageを使用してください。)


- $ cd your project directory
- $ pod init
- $ vi Podfile

target 'target name in your App proj' do
  use_frameworks!
	pod 'blocks-blockchain'
end

- $ pod install

- Open your app.xcworkspace created by pod.

 

## 制限事項

現在、公開アドレス上に公開されているブートノード(Boot Node)はインフラが貧弱なためブートノードはメモリ不足で停止する場合があります。

 

## ライセンス

blocks & overlayNetwork & Testy は MIT Licenseで公開されています。

無料で、あなたのアプリに組み込んで利用できます。 いろんな目的のアプリに組み込み可能ですが、仮想通貨取引所で交換可能な暗号資産として使用することを禁止します。

 

## 禁止事項

仮想通貨取引所で交換可能な暗号資産として使用することを禁止します。

 

## その他説明

### Actors:

- Boot Node

Overlay Network (blocks P2P Network)で最初のノードです。

 

- Baby Sitter

あるノードが、OSI参照モデルのセッションレイヤーとしてのオーバーレイネットワークに参加する際には、最初に Baby Sitter NodeをbindサーバーのTXTレコードから見つけ、FSコマンドを送信する必要があります。 Codeプロトコルによる実装されるDHT(分散ハッシュテーブル)のエントリーごとにです。

 

- Taker

OSI参照モデルのプレゼンテーションレイヤー/アプリケーションレイヤーとして振る舞うblocksブロックチェーンのネットワークに参加するために、まず最初に行うことは、出生証明書を申請することです。 このネットワークには、管理者や管理ノードは存在しないため、Takerとなってくれるノードを見つける必要があります。 AT (Ask For Taker) 要求をトランザクションとしてネットワークに流すためです。

 

- Booker

Bookerとして振る舞うノードは、まだBookされていないトランザクションを収集し、プルーフオブワークによりノンスを計算し、ブロックをネットワークに流します。 ノンス値が正確な場合、最初のノードがBookerとなり、一時的にブロックチェーン管理者として振舞います。次回のプルーフオブワークまでの期間です。

 

### Things:

- Book

blocksブロックチェーンが記述されたもの。

 

### 言語:

- Swift (Protocol Oriented)
- SwiftUI iOSのみ
- C++ (Metal) iOSのみ
- objc (DNS resolv) iOSのみ
- Python (Signaling)

 

### サードパーティライブラリの使用

使用していません。しかし、他の著作物を含んでいます。
- QuadKey - Microsoft Corporation
- SHA-512 - Aaron D. Gifford

 

### プログラミングアーキテクチャ

DDD, Onion Architecture (Protocol Oriented)

 

### バイトオーダー

- Distributed Hash Table (Finger table) address
Little Endian

- nonce
Little Endian

 

### cpu, gpu

nonce の計算はcpuもしくはgpuを選択可能です。iOSのみ

## ステータス

Beta

Advanced Featuresを除く、すべての機能が実装されました。

 

#### 未実装のAdvanced Features (20250318 16:53 JST Tokyo 現在)

- Blockの圧縮、Light Node

- Commandオペランドの圧縮

- Birth Transaction、BasicIncome Transactionの重複チェックの高速化

- イレギュラー発生時の手続き

- ライブラリ利用ドキュメントの整備

- Beta Test

- Multi Signaling Servers Orchestration Work