はいみなさんこんにちは。
NEM Advent Calendar 2018のトリ記事です。
ハナの記事も書いたのでこちらもよろしく。
NEMで透明性ある抽選機能をつくる
トリとった経緯
某PoliPoliのCTO氏に、「なんか記念に書いとけば?」と言ったところ謎にトリ枠を取得されまして、
「いやトリ枠書ける自信あるのかよ」「自分が新人バンドやってて、紅白歌合戦でトリ任されたらどう思う?」といったところ
いやアドベントカレンダーは紅白歌合戦じゃないと思うんですよね、ラーメン屋の行列最後尾だと思います。
などと謎理論を繰り出したので、もうダメだと思い枠を奪いました。
(アドベントカレンダーみんな早く書きたいと思って順とってるならハナ真っ先に埋まるだろ。。。
この記事の経緯
NEMでトラストレスに二方向ペッグのサイドチェーンをトラストレス注入した上でつくる、という記事を予定していていろいろごにょごにょやってたけど、多分無理という結論に達しました。
なので記事のテーマをマルチシグアカウントの暗号化メッセージとします。
Plasma
Plasmaはなにかと超簡単にいうと、「サイドチェーンノード運営者が不正していたらメインチェーン上でペナルティを課すことでサイドチェーンをトラストレスにする」というサイドチェーンをつかったEthereumのスケーリングソリューションです。
メインチェーンが監視してくれるのでトラストフルなはずのサイドチェーンに「トラストレス注入」ができます。
これをNEMで実現することによってトラストレスセカンドレイヤーをつくれないかと考えたのですが、結論としては「ペナルティを課す部分をトラストレスに作れないので不可能」かと思いました。
Lightning Network
Lightning Networkはなにかと超簡単にいうと、2of2のマルチシグアカウントに資産を預けておき、時限装置的に自動で引き出せるようにしてトラストレスにしておきつつもそのマルチシグアカウント内の資産の配分を変えるだけでオフチェーン取引していくということをどんどん連鎖的にやっていくBitcoinスケーリングソリューションです。
結論としては、時限装置的にユーザーに権力が傾くので、二方向ペッグに向いた仕組み、もっというとユーザーとサイドチェーンで権力が釣り合った仕組みにできませんでした。
でもNEMでもLNっぽいことは多分頑張ったらできる気はする(スケーリングソリューションいるほど詰まってないので需要はない)。
将来やりたい場合
Tendermintコンセンサスで作られたブロックチェーン同士を、IBC通信で接続するCosmosプロジェクトの開発チームに直接聞いたところ、Cosmos PlasmaHub的なものを構想しているそうです。なのでそこにセキュリティ注入してもらうTendermintチェーンをつくり、そこでNEMと二方向ペッグする機能をもたせると、これができるかもしれない。
それはさておき、Cosmos PlasmaHubは将来のお話なのでこの記事は別の話を書くことにします。
NEMのマルチシグアカウントで暗号化メッセージをつくる
はい、本題。
NEMの暗号化メッセージに関してはこちらの記事がバイブル的存在なので一読をおすすめします。
NEMのメッセージ暗号化の仕組み
この記事を読んでいただくとわかるのですが、マルチシグアカウントへ/から、暗号化メッセージを送信することはできません。
そこで、マルチシグアカウントで暗号化メッセージをつくる方法を新たに作っていこう、という話なわけです。
マルチシグなので、n人のうちk人揃わないと読めない、というところまでこだわります。
考え方
- 暗号化メッセージをマルチシグアカウントと送受信したい相手側が、共通鍵 = F(相手の秘密鍵, マルチシグアカウントの公開鍵, salt)を導出
- それを秘密とする(k,n)しきい値のシャミア秘密分散法でシェアを導出する
- そのマルチシグアカウントはk of nであるとしてk,nを決めるのがわかりやすい
- そのシェアをマルチシグ連署名者に分け与える
kが1の場合、共通鍵をそのまま保持しておくのと同義。
注意
マルチシグアカウントの使い物にならない秘密鍵自体を秘密とするシャミア秘密分散を行う場合、
- 秘密鍵をばらしているので、マルチシグ解除して普通のアカウントに戻すことができない(物理的には不可能ではないがやってはいけない)
- マルチシグ連署名者から外した人間も、シェアから秘密復元時に秘密を保存しておくと未来永劫に暗号化メッセージが読める
というデメリットがあるので、共通鍵を秘密分散するようにします。そうすることで、その相手からの暗号化メッセージのみ読めるようになるだけなので、仲間はずれにしたい連署名者が出てきた場合、暗号化メッセージを送る相手側アカウントを変えればすみます。
シャミア秘密分散
(k,n)しきい値法とシャミアの秘密分散法
わかる人にはわかるかもしれませんがわかりにくい記事なので例を上げましょう。
例えば秘密の数字12があったとします。
12の数字を3人で分散して保管し、2人集まったら12という数字がわかるようにしたい。
そこで、適当なk-1多項式、ここではk-1=1なので適当な一次式を考えます。
f(x)=2x+12
としときましょう。f(0)の値が、12になるようにします。
そして3人には、適当なxから求めた(x,f(x))を1つずつわたします。
Aさんには(1,f(1))=(1,14)、Bさんには(2,f(2))=(2,16)、Cさんには(3,f(3))=(3,18)、といった具合に。
で、AさんとBさんが2人で数字を解読したいとき、以下の多項式を用意します
f(x)=ax+b
で、(1,14),(2,16)を代入し、以下の連立方程式をときます。
\begin{array}
1a + b = 14 & \\
2a + b = 16 &
\end{array}
結果として、
a=2,b=12
というのがわかり、秘密の数字は12だ!ということがわかります。
これがシャミア秘密分散です。
これを共通鍵に応用することで、n人のマルチシグ連署名者のうちk人揃わないと読めない暗号化メッセージをつくることができます。
結論
流れを最後にもう一度まとめます。
- 暗号化メッセージをマルチシグアカウントと送受信したい相手側が、共通鍵 = F(送信者の秘密鍵, マルチシグアカウントの公開鍵, salt)を導出
- それを秘密とする(k,n)しきい値のシャミア秘密分散法でシェアを導出する
- そのマルチシグアカウントはk of nであるとしてk,nを決めるのがわかりやすい
- そのシェアをマルチシグ連署名者に分け与える
- マルチシグ連署名者が暗号化メッセージを解読したい場合、仲間を集めてシャミア秘密分散された共通鍵を探し当てる。
こうすることで、
NEMのマルチシグアカウントで、n人の連署名者のうちk人揃わないと読めない暗号化メッセージを送受信できると考えられます。
では。