とりあえず...BuildできたmposのDockerfiles


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう
FROM ubuntu-upstart:latest

MAINTAINER  SachiO

RUN rm -rf /usr/sbin/policy-rc.d 
ADD policy-rc.d /usr/sbin/policy-rc.d
RUN chmod +x /usr/sbin/policy-rc.d

ADD litecoind /bin/litecoind
RUN chmod +x /bin/litecoind

RUN mkdir /root/.litecoin \
    && mkdir /root/.litecoin/testnet3

ADD litecoin.conf /root/.litecoin/litecoin.conf
ADD wallet.dat /root/.litecoin/testnet3/wallet.dat

ENV APACHE_RUN_USER="www-data" \
    APACHE_RUN_GROUP="www-data" \
    APACHE_PID_FILE="/var/run/apache2.pid" \
    APACHE_RUN_DIR="/var/run/apache2" \
    APACHE_LOCK_DIR="/var/lock/apache2" \
    APACHE_LOG_DIR="/var/log/apache2" \
    APACHE_USER_UID="0" \
    DEBIAN_FRONTEND="noninteractive"

RUN apt-get update -qq \
    && apt-get install -y apt-utils perl --no-install-recommends

RUN dpkg-divert --local --rename --add /sbin/initctl \
    && ln -s /bin/true /sbin/initctl

RUN apt-get install -y software-properties-common \
    && apt-get install -y software-properties-common python-software-properties \
    && apt-get -y update \
    && apt-get -y upgrade \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C \
    # && gpg -a --export 4F4EA0AAE5267A6C \
    # && apt-key add - \
    && add-apt-repository ppa:jonathonf/python-3.6 \
    && apt-get -y update \
    && apt-get install -y python3.6 \
    && add-apt-repository ppa:ondrej/php \
    && apt-get -y update \
    && apt-get -y upgrade \
    && apt-cache policy php5.6 \
    && apt-get install -y  libapache2-mod-php5 \
    php5-memcached \
    php5-mysqlnd \
    php5-curl \
    php5-json \
    && apt-get install -qqy --force-yes \
    build-essential \
    apache2 \
    cron \
    pwgen \
    supervisor \
    curl \
    openssh-server \
    libboost-all-dev \
    libcurl4-openssl-dev \
    libdb5.3-dev \
    libdb5.3++-dev \
    git \
    memcached \
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get install -y mysql-server-5.5 \
    && apt install -y mysql-server \
    mysql-client
RUN python -V

RUN wget https://bootstrap.pypa.io/get-pip.py \
    && python get-pip.py \
    && python3 get-pip.py

RUN python -V \
    && rm /usr/bin/python \
    && ln -s /usr/bin/python3.6 /usr/bin/python \
    && python -V \
    && ln -s /usr/bin/pip3 /usr/bin/pip

RUN pip3 install -U distribute \
    && pip install -U distribute \
    && rm -rf /etc/apache2/apache2.conf

ADD apache2.conf /etc/apache2/apache2.conf
ADD apache_default /etc/apache2/sites-available/000-default.conf

RUN cd /var/www \
    && git clone git://github.com/MPOS/php-mpos.git mpos \
    && cd mpos \
    && python -V \
    && git checkout master \
    && chown -R www-data templates/compile templates/cache logs \
    && cd /root \
    && python -V \
    && git clone https://github.com/ahmedbodi/stratum-mining.git \
    && cd /root/stratum-mining \
    && python -V \ 
    && git submodule init \
    && git submodule update \
    && cd /root/stratum-mining/externals/litecoin_scrypt \
    && python -V \
#    && apt-get install -y python-dev \
    && apt-get install -y python3-dev \
#    && export CPATH=$CPATH:/usr/include/python2.7/ \
    && export CPATH=:/usr/include/python3.6/ \
    && printenv \
    && python -V \
    && python3 setup.py install \
#    && python2 setup.py install \
    && cd /root/stratum-mining/externals/stratum \
    && printenv \
    && python -V \
    && python3 setup.py install \
#    && python2 setup.py install \
    && mkdir /root/stratum-mining/log

ADD config.py /root/stratum-mining/conf/config.py
ADD global.inc.php /var/www/mpos/include/config/global.inc.php
ADD start-apache2.sh /start-apache2.sh
ADD start-mysqld.sh /start-mysqld.sh
ADD start-cron.sh /start-cron.sh
ADD start-litecoind.sh /start-litecoind.sh
ADD start-stratum.sh /start-stratum.sh
ADD start-memcached.sh /start-memcached.sh

ADD run.sh /run.sh
RUN chmod 755 /*.sh

ADD my.cnf /etc/mysql/conf.d/my.cnf
ADD supervisord-apache2.conf /etc/supervisor/conf.d/supervisord-apache2.conf
ADD supervisord-mysqld.conf /etc/supervisor/conf.d/supervisord-mysqld.conf
ADD supervisord-cron.conf /etc/supervisor/conf.d/supervisord-cron.conf
ADD supervisord-litecoin.conf /etc/supervisor/conf.d/supervisord-litecoin.conf
ADD supervisord-stratum.conf /etc/supervisor/conf.d/supervisord-stratum.conf
ADD supervisord-memcached.conf /etc/supervisor/conf.d/supervisord-memcached.conf

ADD cron /etc/cron.d/cron
RUN chmod 0644 /etc/cron.d/cron \
    && chmod +x /etc/cron.d/cron \
    && rm -rf /var/lib/mysql/*

ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
RUN chmod 755 /*.sh

RUN a2enmod rewrite \
    && service apache2 restart

ENV PHP_UPLOAD_MAX_FILESIZE="10M" \
    PHP_POST_MAX_SIZE="10M"

RUN mkdir /var/run/sshd \
    && echo 'root:root' |chpasswd \
    && sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \
    && sed -ri 's/from autobahn.websocket import WebSocketServerProtocol, WebSocketServerFactory/from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory/g' /usr/local/lib/python2.7/dist-packages/stratum-0.2.13-py2.7.egg/stratum/websocket_transport.py
ADD supervisord-openssh-server.conf /etc/supervisor/conf.d/supervisord-openssh-server.conf

EXPOSE 80 443 3306 22 3333
CMD ["/run.sh"]

Windows 10 Home, Docker Toolbox

ちょっとした嘘


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

AIについてのちょっとした嘘

AIのブームはいつまで続くでしょうか.AIは確かに,世界を革命的に変化させるような力を持つように見えます.ただし,その技術は誇張されているかもです.
実は,AIを名乗る企業でも本当に革新的なAIテクノロジを駆使しているわけではありません.つまり自称人工知能なのです.彼らは,既存のソフトウェアにAIを付加的に用いて,ソフトウェアをより興味深く見せるための道具としてAIを使用しています.
例えば,チャットボットは,大手企業のライブラリやAPIを使用して対話を作成したり,キーワードの探索して対話します.ここで使われるAIは,大企業で学習済みのデータ・ライブラリを使用しているだけです.時には,単なるデータベースを使うことさえあります.
もっと言えば,AIがこなしているように見せかけても,人が作業している場合もあります.
このようなからくりは,どうしたら見破れるでしょうか?,単純にサービスが,安い,AIの専門家がいない,機械学習に利用できる大きなデータを持っていないことを見ればよいでしょう.

ブロックチェーンのちょっとした嘘

ブロックチェーンは,おそらく人工知能に次いで,ブームになっています.ブロックチェーンを扱う世界は,本当に小さなギークの集団から,何千億もの時価総額を持つ世界的な業界へと急速に成長しました.
ブロックチェーンを用いた暗号通貨の開発がオープンソースであり,この性質により,この業界は一気に世界規模に進出することが可能になりましたが,そこには,少しばかり?!の嘘もあります.
ほとんどのICOは機能していないのが現状です.つまり大多数は成功していないのです.

何が正しいの?

皆さん知りたいですよね.経済的に成功している国の指導者たちを見ると,絶望感があるかもしれません. 嘘はときには.人々が未来に進むのを手助けしているように見えます.技術の進歩は,多くの情報と機会を私たちに与えてくれて,民主化を進めるための最も公正な方法でだと私たちは考えます.少なくとも私たちは,人類の未来を本当に気にかけているのです.それこそ,トラストレスに...

ビルド成功です...次回からはcoindで


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

今回は,相当ハマりました.ハマりどころは,まず...

1)サンプルとしていたnrpatten/mpos-docker のベース・イメージが旧かったので,ベースイメージを変更するのに手間取った,

これは,いろいろ試した結果, ubuntu-upstart にしました.その結果,追加する場所が増えました.

・apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C
・apt-cache policy php5.6

です.この二か所を追加するのに結構訳が分からなくなりました.地道にエラーを潰す感じです.またイメージを変えたことでVirtualBoxのストレージ容量を大きくする必要がありました.

2) python3を入れることを忘れていた.

3)鬼のような依存関係...

4)Docker Quickstart Terminalが,DNSをしばしば見失う.

たった二つのことを潰すのに,すげぇ手間が要りました.かなり勉強になりました.次回からは,coindでイメージを作ります.また,ハマりどころをお知らせします.

Successfully built 153125192b11
Successfully tagged nrpatten/mpos:latest

合意形成と障害


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

分散システムアプローチ

Casper CBCは,分散システム問題として合意形成の問題に取り組んでいます.

まずはじめに,分散システムにおける障害とは,なんでしょうか.

コンセンサスメカニズムの前提は,「障害の数が十分に少なければ,すべて問題ない」ということです.これは,「十分に障害がある場合にのみ,問題が発生する」と言い換えることができます.

コンセンサスメカニズム

さて,わかりにくい専門用語に慣れましょう.

バリデータ:合意を形成するノードのことをバリデータと呼ばれます.
メッセージ:メッセージは、合意に達することを試みる努力の中でバリデータによって生成され伝えられます.

メッセージ

メッセージは,合意形成プロセスに参加している間にバリデータによって生成され,伝えられる情報です.Casper CBC合意形成メカニズムでは,メッセージは以下の構造を持ちます.

メッセージ構造 =(値、バリデータ、正当化)

メッセージ構造を説明します.

値:値は,バリデータが合意に達するようにネットワークに提案する値のことです.
バリデータ:これはメッセージを生成しているバリデータです.
正当化:メッセージの正当化は,バリデータがその特定のメッセージを生成している間に確認および確認した一連のメッセージです.後で見るように,その正当化は提案された値を文字通り「正当化する」ことになっています.

ここで,メッセージに関わる2つの重要な概念を見てみましょう.

後のメッセージ:メッセージAがメッセージBの正当性を説明するものである場合,メッセージBはメッセージAよりも後になります.
推定関数:推定関数は,正当化を入力として,入力によって「正当化された」値を返します.

合意規則

提案された値は,正当化に対する推定関数の適用によって返された合意形成値と同じでなければなりません.
バリデータは2つのメッセージを作ることができないようになっています.

合意規則違反

バリデータが,受け取ったメッセージの時点差により,分離されるかもしれません.

意思決定保証

十分な数のバリデータが提案する有効な値を含むメッセージを作成した後に,多数のバリデータがフォルトを生成することなしに矛盾する値について合意形成することは不可能であることを合意規則は保証します.

したがって,十分な数のバリデータが有効な値を含むメッセージ見た後で,ノードは合意値を決定します.この「十分に高い」数は、そのノードのフォールトトレランス閾値によって異なります(この十分という部分は未定義です).

合意形成プロトコルCBCについて


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

合意プロトコルは,通信ノード同士が何かに同意することを保証するメカニズムです.ブロックチェーンで新しいブロックをダウンロードするノードは,システムの履歴としてトランザクションに確実に同意することを望みます.作業証明(PoW)では,ノードがあるトランザクションでハッシングを解くと,標準チェーンに含まれることを意味します.

PoWの欠点は,非常に多くのエネルギー消費と,ブロックチェーンを維持するセキュリティとを満たしながら,スループットを増加させることが可能かどうかが定かではないところです.それでは,他の合意プロトコルはあるでしょうか?,作業料分だけ手数料を受け取るのは,理にかなっています.

それでも,Proof of Stake(PoS)という手法もあります.それは,ある量の資本を(例えば暗号通貨)を持つノードを信用して,次のブロックの選択権を得るというものです.

ここでは,合意プロトコルの概念を確認していきましょう.

CBCというプロトコルを説明していきます.

システムを設計するとき,セキュリティは重要です.システムを徹底的にテストすることは,システムが意図したとおりに機能することを確認する1つの方法です.それは予測可能な方法で機能しているでしょうか.与えられた入力は,内部的な矛盾を引き起こしませんか.

ここで,紹介するCBCという手法は,次のようなことも許容します.システムの部分が,未定義のままにされるかもしれません,これはよく言えば仕様が変更できるということです.ある性質Pがある空間Sに存在するメカニズムとして成立することを証明することができれば,Sのサブセット上でのメカニズムS’で,性質P’を証明できるかもしれません.たとえば,Sをブロックチェーン合意メカニズムのSとします.最長のチェーンフォーク選択するというこというメカニズムがS’になるように考えましょう.フォークの選択へある規則制をもちこむことによって一貫性が得らます.それは,S’におけるプロパティP’を得ることでもあります.

ノードがやり取りするメッセージは,可能な合意値を見出し,この値について合意を達するために送信されます.

合意値
検証(送信者)への参照
プロトコルによる状態の参照(正当化)

例えば,AとBという2つの検証があり,常にメッセージに値1を送信します.プロトコルは,最初は何もしません.だれでも送信できるメッセージは,名前,値1、および前の状態への参照,空集合だけです.この時点でネットワークのノードから見えるものは,空集合ø,Aからのメッセージ,Bからのメッセージ、またはAとBからのメッセージです.

私たちは,新たなメッセージが構築される以前のプロトコルによる状態を参照できるようにするために各メッセージを必要とします .プロトコルによって送られのは,単なるメッセージであり,それぞれのメッセージは以前のプロトコルによる状態を参照します.

プロトコルによって,タイミングにより,状態は分岐するかもしれません.

その場合,ノードはどちらが正しいのかを決定できなければなりません.つまり,合意値が0と1の両方であると決定することはできないいうことです.これが安全性の保証となります.

このような安全性を保つことは,2つのノードにとっては簡単です.2つのノードによって決定された合意値はお互いに明白です(常識的には片方が決まれば,もう片方決まります)が,例えば,3つの合意値が一致しないことがあります.
ライトを点灯させるには2つのスイッチをオンにする必要があるとします.2つのノードがスイッチを観察し,3つめのノードはライトを観察します.1つのスイッチがオンになっていても,必ずしもライトが点灯しているとは限りません.つまり,ライトが消えている間は,2つのノードは両方のスイッチがオンになっているのを観察することはできません.これは,両方のスイッチがオンになっていても,ライトが点灯していないことも許します.

このようなことは,ひとつのスイッチとライトの点灯の有無は明白です.

そこでCBCは,メッセージに重みづけ(合意値0のようなメッセージは重みをなくす)をして,重みがある閾値よりも大きい限り一貫した決定を下せるようにします.

これまでのところ,決定はプロトコルによる状態に依って行われて,プロトコルによる状態から合意値に向かう関数を私たちはもっていません.ここで,注目すべきは,推定量という概念の導入です.プロトコルによる状態が与えられると,推定量は合意値を返します.CBCでは,推定量は未定義のままです.

dockerfileファイルでハマる...その2


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

以下のdockerfile(エラーの出るところまで)を試行しています.dockerのイメージを作成しているので,基盤OSは,関係と思います.

FROM 1and1internet/ubuntu-16:latest

MAINTAINER xxxxx

RUN rm -rf /usr/sbin/policy-rc.d 
ADD policy-rc.d /usr/sbin/policy-rc.d
RUN chmod +x /usr/sbin/policy-rc.d

ADD litecoind /bin/litecoind
RUN chmod +x /bin/litecoind

RUN mkdir /root/.litecoin \
    && mkdir /root/.litecoin/testnet3

ADD litecoin.conf /root/.litecoin/litecoin.conf
ADD wallet.dat /root/.litecoin/testnet3/wallet.dat

ENV APACHE_RUN_USER="www-data" \
    APACHE_RUN_GROUP="www-data" \
    APACHE_PID_FILE="/var/run/apache2.pid" \
    APACHE_RUN_DIR="/var/run/apache2" \
    APACHE_LOCK_DIR="/var/lock/apache2" \
    APACHE_LOG_DIR="/var/log/apache2" \
    APACHE_USER_UID="0" \
    DEBIAN_FRONTEND="noninteractive"

RUN apt-get update -qq \
    && apt-get install -y apt-utils perl --no-install-recommends

RUN apt-get install -y software-properties-common \
    && apt-get install -y software-properties-common python-software-properties \
    && apt-get -y update \
    && apt-get -y upgrade \
    && add-apt-repository ppa:ondrej/php \
    && apt-get -y update \
    && apt-get -y upgrade \
    && add-apt-repository ppa:jonathonf/python-3.6 \
    && apt -y update \
    && apt install -y python3.6 \
    && apt-get install -qqy --force-yes \
    php5.6 \
    php5.6-cgi \
    build-essential \
    apache2 \
    cron \
    libapache2-mod-php5.6 \
    pwgen \
    supervisor \
    curl \
    openssh-server \
    libboost-all-dev \
    libcurl4-openssl-dev \
    libdb5.3-dev \
    libdb5.3++-dev \
    mysql-server \
    git \
    python3-dev \
    python3-twisted \
    python3-mysqldb \
    python3-setuptools \
    python3-memcache \
    python3-simplejson \
    python3-pylibmc \
    memcached \
    php5.6-memcached \
    php5.6-mysqlnd \
    php5.6-curl \
    php5.6-json

RUN easy_install -U distribute \
    && rm -rf /etc/apache2/apache2.conf

ADD apache2.conf /etc/apache2/apache2.conf
ADD apache_default /etc/apache2/sites-available/000-default.conf

RUN cd /var/www \
    && git clone git://github.com/MPOS/php-mpos.git mpos \
    && cd mpos \
    && git checkout master \
    && chown -R www-data templates/compile templates/cache logs \
    && cd /root \
    && git clone https://github.com/ahmedbodi/stratum-mining.git \
    && cd /root/stratum-mining \
    && git submodule init \
    && git submodule update \
    && cd /root/stratum-mining/externals/litecoin_scrypt \
    && python3 setup.py install \
# ここです!!

    && cd /root/stratum-mining/externals/stratum \
    && python3 setup.py install \
    && mkdir /root/stratum-mining/log
#

以下が,Terminaで出てくるエラーです,

Traceback (most recent call last):
File “setup.py”, line 3, in
use_setuptools()
File “/root/stratum-mining/externals/stratum/distribute_setup.py”, line 145, in use_setuptools
return _do_download(version, download_base, to_dir, download_delay)
File “/root/stratum-mining/externals/stratum/distribute_setup.py”, line 124, in _do_download
to_dir, download_delay)
File “/root/stratum-mining/externals/stratum/distribute_setup.py”, line 194, in download_setuptools
src = urlopen(url)
File “/usr/lib/python3.5/urllib/request.py”, line 163, in urlopen
return opener.open(url, data, timeout)
File “/usr/lib/python3.5/urllib/request.py”, line 472, in open
response = meth(req, response)
File “/usr/lib/python3.5/urllib/request.py”, line 582, in http_response
‘http’, request, response, code, msg, hdrs)
File “/usr/lib/python3.5/urllib/request.py”, line 510, in error
return self._call_chain(args) File “/usr/lib/python3.5/urllib/request.py”, line 444, in _call_chain result = func(args)

ありがちなエラーですが,

File “/usr/lib/python3.5/urllib/request.py”, line 590, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)

urllib.error.HTTPError: HTTP Error 403: SSL is required

dockerのイメージ作成中に,適切な修正方法がわかりません.誰かご教授ください.

※ stratum/setup.py 
#!/usr/bin/env python

#たぶん,ここから...distribute_setup.pyは長いので割愛です.

from distribute_setup import use_setuptools
use_setuptools()

#

#python setup.py sdist upload

from setuptools import setup
from stratum import version

setup(name='stratum',
      version=version.VERSION,
      description='Stratum server implementation based on Twisted',
      author='slush',
      author_email='info@bitcion.cz',
      url='http://blog.bitcoin.cz/stratum',
      packages=['stratum',],
      py_modules=['distribute_setup',],
      zip_safe=False,
      install_requires=['twisted', 'ecdsa', 'pyopenssl', 'autobahn',]
)

dockerfileファイルでハマる...


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

未だ,途上にあるのですが...

ansibleの実行環境まではできましたが,次にdockerfileでハマってます.まず,nrpatten/mpos-docker
イメージが旧すぎて依存関係でエラーが出るので,

add-apt-repositoryを入れるのにppaがいるが,ppaを使うには,前者が要るという再帰的なハマりに...

そこで,新しいubuntuイメージを落として,それに合わせて
dokerfileを書き換えることにしました.

っが,

File “/usr/lib/python2.7/urllib2.py”, line 556, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: SSL is required

dockerfileのイメージbuildで出てしまう.

python setup.py installで出るのだが,これの解消法がわからない,urllib3をインストールする設定でも
ダメです.ssl.pyを自分で書いて,ADDするのか?,普通ならimportできるけど,この場合は編集できない.

というわけで,もう少し考えてみます.

Windowsで何とかAnsibleを使うまで


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

Docker For Windows + LinuxOS Image + Ansibleによって,BitZenyをセットアップするまでを報告していきます.

Docker for Windowsをインストールします.

私のWindows10はhomeです.

Hyper-Vが動かないHomeでは,Hyper-Vの代わりにOracle Virtual Boxを利用します.
Docker Toolboxも利用します.

※Hyper-Vは,なぜかサービスとしては,僕のhomeでは入っています(どのタイミングかは不明です),明示的に起動されていないですが,実際に起動した場合の設定とかは,試していないです.

詳しくは ↓ です.

https://qiita.com/idani/items/fb7681d79eeb48c05144

とりあえず,Vagrantも導入します(Windows Powershell).

詳しくは,↓ です.

https://qiita.com/ozawan/items/160728f7c6b10c73b97e

https://qiita.com/Tkm_Kit/items/58e1fb7990387a2e9c76

Docker Quickstart Terminalを起動します.

Dockerfileを用意します.

FROM centos
MAINTAINER put your E-mail adress
RUN yum -y install epel-release && yum clean all
RUN yum -y install python-pip && yum clean all
RUN yum -y reinstall glibc-common && \
pip install –upgrade pip && \
pip install ansible==2.6.4 && \
pip install pywinrm && \
yum clean all && \
mkdir /mydata
ENV LANG ja_JP.UTF-8
CMD [“/bin/bash”]

Dockerfileのあるディレクトリで,

docker build -t ansible-test .

を実行します.私の場合は,タイムアウトするので ↓ を参照してください.

https://qiita.com/koneko59/items/d9b4ba74477412d91cf0

さらに,私の場合は,

docker runでエラーが出ますが,それは ↓ を確認ください.

https://stackoverflow.com/questions/50540721/docker-toolbox-error-response-from-daemon-invalid-mode-root-docker

Kitematic (Alpha)を起ち上げて,ローカルディレクトリをマウントします.

Ansibleは使えるようになりました.今回はここまでです.

追記:
nrpatten/mpos-dockerをgitからクローンしてあるので,これを例にまず手を付けていきます.

ブロックチェーンのスケーラビリティ 4


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

先回の続きで,ブロックチェーンのスケーラビリティ解決策を記していきます.

4)シャーディング

ブロックチェーンの分割は,従来のデータベースの分割と似ています.従来のデータベースでは,負荷分散のためサーバーを分割しました.

同様に,ブロックチェーンの分割でも,ブロックチェーンの全体的な状態がさまざまな部分に分割され,各部分はネットワーク内のさまざまなノードによって格納されます.

ネットワーク上で発生するトランザクションは,どのシャードが影響を受けるかに応じて,各ノードに送信されます.各部分は状態のごく一部を並行的に処理します.このとき,シャード間で通信するためには,何らかのメッセージ受け渡しメカニズムになります.

例えば,シャード内のトランザクションが実行されると,ローカルシャードを更新し,同時にレシート(更新した証拠)を生成します.このレシートは,共有メモリに記録されます.

ブロックチェーンを分割するには,高いセキュリティを維持しながら,すべてのノードがすべてのトランザクションのごく一部しか処理しないネットワークを構築する必要があります.これは極めて難しことです.

それは,ブロックチェーンプロトコルでは、ネットワーク内のすべてのノードが互いに信頼し合うとは限らないと想定しています.それでも、トランザクションは異なるコンピューターで処理されるにもかかわらず,共通の状態について合意している必要があるからです.これを解決するには,多くの権限を持つ可能性のある攻撃者に機会を生み出すことなく,どのノードが安全な方法でどの断片を検証するかを決定するメカニズムを見つける必要があります.

分割を実装するのが難しいもう1つの理由は,ブロックチェーン上で実行されるトランザクションがブロックチェーン内の前の状態のどの部分にも依存する可能性があるため,並行して処理するのが困難になるためです.さらに、並列化を使用すると,競合状態などを緩和するための絶対確実な方法が必要になります.

ブロックチェーンのスケーラビリティ 3


https://bitcoin20xx.xyz/未来を変える暗号通貨を作っていこう

ブロックチェーンの大きさを自由に変更できるようにすることは,既知の課題で,数年間にわたって活発に研究されています.

具体的には,

1)SegWitによる解決策です.

Segwit(セグウィット)とは,Segregated Witness(Witness=隔離された署名領域),の略語です.Segwitはトランザクション情報をコンパクトに圧縮することでスケーラビリティ問題の解決が期待される技術のひとつです.

2)ブロックサイズを大きくする.

各ブロックに収まるトランザクション数を増やすことができ,ネットワークは1秒あたりのトランザクション数を増やすことができます.

3)ステートチャネルを使う.

ステートチャネルは次のように機能します.

ブロックチェーンの一部は,マルチシグネチャまたは,ある種のスマートコントラクトを介してロックされています.その場合、チェーンを更新する唯一の方法は,特定の参加者が完全に同意した場合です.

参加者は、トランザクションを直接ブロックチェーンに送信せずにトランザクションを作成して暗号署名することによって,自分自身で更新を行います.新しい更新は以前の更新を上書きします.その後,参加者はブロックチェーンに更新した結果を送り返し,そこでブロックは,ステートチャネルを一旦閉じて,再びステートチャネルを解除します.

ステートチャネルを使うことで,更新を無制限にして,無期限に開いたままにすることができます.このときブロックチェーンは,最終トランザクションを処理するための決済レイヤとして純粋に使用されて,ブロックチェーンの負担を軽減するでしょう.ただし仕組み上トランザクションの透明性は低くなります.

次回に続きます.