スマートコントラクトについておべんきょする
#ブロックチェーン #golang #おべんきょ
ブロックチェーンについておべんきょする の続き
話題のWeb3.0やNFTやDAO。
このあたりの文脈で登場する基本的な知識としてブロックチェーンがある。
ただ、純粋なブロックチェーンを利用してもNFTやDAOは実現できない。
その足りていないものがスマートコントラクトにあると思い、おべんきょする。
スマートコントラクトとは何か? その仕組みや事例、実装への課題を解説 |FinTech Journal
スマートコントラクトとは何か? その仕組みや事例、実装への課題を解説 |FinTech Journal
「スマートコントラクト」とは、ブロックチェーンシステム上の概念であり、あらかじめ設定されたルールに従って、ブロックチェーン上のトランザクション(取引)、もしくはブロックチェーン外から取り込まれた情報をトリガーにして実行されるプログラムを指す。
ブロックチェーンシステム上の概念!
何らかのトリガーが発火したら、連動するプログラムが実行される仕組みのこと。とのこと。
なので、賢い約定って名前やけど、約定に関係ないケースもある。
「スマート」とは「賢い」ではなく、「自動的に実行される」という意味で用いられている。
賢いではない!
スマートコントラクトの一例として自動販売機を挙げた。購入者が欲しい商品を選択し、代金を投入するという、設定されたルールが満たされると、自動販売機がその商品を払い出すというプログラムが自動で実行されるというもの
これは通貨の動き = トランザクションが確認できたところで、関連するプログラムが実行され、商品が払い出される。
なるほど。
ヴィタリック・ブテリン(Vitalik Buterin)氏が2013年に発表したホワイトペーパー「Ethereum: A Next Generation Smart Contract & Decentralized Application Platform」によってイーサリアムのブロックチェーンに実装可能なスマートコントラクトが世に広く提案された。
後で読もう。
「信頼性」
契約や取引は、信頼を提供する仲介者を介することで実行していたが、スマートコントラクトは第三者を介する必要がない。
事前にルールが定められているので、所定の条件が満たされれば必ず自動的にプログラムが実行されるからだ。
中央集権的な信頼できる誰かがいなくても、自動的にプログラムが実行されることで、
トリガーを満たせば信頼できる結果が得られることが確定する。
「透明性」
プログラムされたスマートコントラクトの内容や、それにより実行された取引の記録はブロックチェーン上で公開される
これはブロックチェーンの機能。
スマートコントラクトの結果などもトランザクションと同様にブロックに含まれるのかな?
「コスト削減」
仲介者や信頼性を担保する第三者に支払っていた手数料は不要となる
?
これは分からない。
これらのメリットの多くはブロックチェーンの技術特性に根差しており、スマートコントラクトがブロックチェーン技術の可用性を高めた格好である。
スマートコントラクトだからというメリットではなく、ブロックチェーンの上で実現していることによって得られる恩恵みたい。
スマートコントラクトの活用例として「DAO」がある。これは、「Decentralized Autonomous Organization」の略称であり、自律分散型組織を指す。多くはパブリックブロックチェーン(特定の管理者が存在せず誰でも参加できる)上で構築され、人の意志ではなく、スマートコントラクトによって組織運営が実行されるものだ。
DAOにも興味があるけど、そのためにはスマートコントラクトを理解しておかなければ!
スマートコントラクトに過度な期待をするべきではない
分析の結果、スマートコントラクトはまさに「過度な期待」の頂点から滑り落ちる直前であるとされている。
技術的特性の理解を十分に行っている前提で、
活用範囲を正しく理解したい。
2ページ目からは読めなかった。
スマートコントラクトとは何ですか? | Coinbase
スマートコントラクトとは何ですか? | Coinbase
スマートコントラクトでは他の契約と同様に合意条件を取り決めます。しかし、従来の契約とは異なり、スマートコントラクトの条件は、イーサリアムのようなブロックチェーン上のコードとして実行されます。
ブロックチェーンのセキュリティ、信頼性、アクセシビリティを活用したアプリを構築しながら、高度なピアツーピア機能(ローンや保険から物流、ゲームまで)を提供できます
ざっとした理解としてはOK。
スマートコントラクト対応のアプリは多くの場合、「分散型アプリケーション」または「Dapps」と呼ばれます。
Dappsはキーワードっぽいねー。覚えておこう。
銀行業界の変革を目指す分散型金融(またはDeFi)テクノロジーが含まれます。
DeFiもよく登場するキーワード。覚えておこう。
現在、イーサリアムが最も一般的なスマートコントラクトプラットフォームですが、他の多くの暗号資産ブロックチェーン(EOS、ネオ、テゾス、トロン、ポルカドット、およびアルゴランド)でも実行できます。
スマートコントラクトに対応している暗号資産はいくつもあるみたい。
スマートコントラクトはさまざまなプログラミング言語(Solidity、Web Assembly、Michelsonを含む)で書かれます。
イーサリアムネットワーク上では、 各スマートコントラクトのコードがブロックチェーンに保存され、当事者がそのコントラクトのコードや現在の状況を点検して機能を検証することができます。
当事者ってのは取引をする両人のことなんかな?
スマートコントラクトにユーザーから資産が入庫されると、その成果と、結果として起こる価値フローについて合意を得るため、ネットワークの全ノードがそのコードを実行します。これにより、ユーザーが未知の相手と複雑な金融取引を行う場合でも、中央権限なしで安全にスマートコントラクトを実行できるのです。
うおう、いきなりぶっ飛んだ気がする。
スマートコントラクトに資産が入庫
ネットワークの全ノードがコードを実行
もっと詳しい仕組みを掘らないと受け入れられない情報。
Bplus53_小特集_解説_スマートコントラクト_三久.indd
Bplus53_小特集_解説_スマートコントラクト_三久.indd
単なる契約の執行だけではなく、一連の処理を自動化することが可能であり、既存の中央集権型のアプリケーションを置き換えるような高いポテンシャルを秘めている。
スマートコントラクトというワードに引っ張られがちやけど、実際は処理の自動化がメインな感じ
「スマートコントラクト」という言葉は、よく"契約をスムーズに行う技術" と思われがちである
ブロックチェーンが広まった現在では、このような意味におけるスマートコントラクトの用法は誤解である
「Ethereum ネットワークプロトコルの一部として、EVM(Ethereum Virtual Machine)の文脈として確定的に実行される、変更不可能なコンピュータプログラム」と定義している
スマートコントラクトは、ブロックチェーン上に乗っかっている場合については、確定的に実行され、変更不可能なコンピュータプログラム。と認識しておいた方がよさそう
スマートコントラクトの動作は実行を行うノードの時刻や環境変数に左右されない決定的なものである
コードや関数の実行は誰が実行したとしても同じ結果になる
何度も実行される懸念をぬぐえないものの、実行結果は常に同じになるという前提はありがたい
誰かがスマートコントラクトを実行したという事実をブロックチェーン上で一意に共有できる
いつ誰がどこで実行しても同じ結果 = 結果が出ていれば誰かが実行したことがある
ってことなんかな?
とりあえず実行済みかどうかをネットワークで共有できていることになってる
スマートコントラクトは Solidity のような高級言語で記述されることが多い
きいたことないなー
調べてみよう
EVMという実行環境で動作するバイトコードにコンパイルされる
EthereumではノードがVMを備えてるってことなんかな
コンパイルを経てブロックチェーン上に展開されるとコントラクトはアドレスという識別子を与えられる
このアドレスを参照することで実行することができる
コントラクトは展開されるようなものなのか
スマートコントラクトのバイナリ実行ファイルのことをコントラクトと呼んでる?
実行はアドレスを参照することで行えるっぽい
スマートコントラクトは、ブロックチェーン上にプログラムの実行コードと変数を保持する
この実行コードと変数を、スマートコントラクトでは「コントラクト」と呼ぶ
なるほど!実行コードと変数をセットでコントラクトと呼ぶのか!
トランザクションを発行してコントラクトを実行することで、変数の書き換えや送金を行う
これもしかして、ひとつのトランザクションから次のトランザクションに繋がっていくと同時に、
コントラクトも持ちまわっていく?
じゃあ新たなコントラクトをトランザクションに持たせることはできない?
疑問や
写真や不動産の権利といった価値をトークンとして定義し送受信することで、中間者を排除しつつ不正の行なえない取引基盤を構築できる
ここでのトークンは下記の意味
スマートコントラクトによって定義される電子的な資産
用途に応じた企画が存在し、規格に準じたトークンを発行することで、ウォレットソフトなどで気軽に送受信することができる
Ethereum で最も存在感のある実例は、ICOだろう
ICOは新規事業を発足する際などに、株式のように独自トークンを発行して暗号通貨の投資を募る資金調達法である
なるほどいい。
詐欺ICOの頻発や法律上の扱いが問題視されたことから、現在はSTOという有価証券としてトークンを発行することで厳密に法規制を満足する形に移行している
法律に合わせることもできていると!すごい
実行時の挙動や安全性の性質が従来のプログラミング言語と大きく異なる
開発者目線では従来のプログラミング言語の知見が使いにくい
実行時に変数を定義してメモリ上に展開する~みたいなのとは全然違うからか
プログラムのバイトコードが誰でも閲覧可能になってしまうため、プログラムそのものの解析が攻撃者にとって実施しやすい
ブロックチェーンという金銭的価値のあるデータを取り扱うことが多いため、悪意のあるユーザに攻撃されるなどサイバー犯罪も起きやすい
性質上しょうがないよなーって感じがする
が、金銭的価値が絡まなければ攻撃するメリットは減るかも?
まあいまはそれは議論の点じゃないのでスキップする!
従来のプログラミング言語との重大な違いとして、一度利用を開始したスマートコントラクトは変更不可能となる点がある
脆弱性を持つコードを利用してしまった場合は、長期的に踏み台にされる
人間はミスするものなので、まー、こわいね
イーサリアムでスマートコントラクトを開発したいとき、最初に押さえておくべき用語と概念は?:CodeZine(コードジン)
イーサリアムでスマートコントラクトを開発したいとき、最初に押さえておくべき用語と概念は?:CodeZine(コードジン)
トランザクションはイーサリアム仮想マシン(EVM)というシステム上で動作し、ステートツリー(state tree:状態木)を変更するコードを実行します。
ステートツリー。とりあえず頭の片隅に入れておく。
イーサリアムの公式クライアントはgethというプログラム
geth。とりあえず頭の片隅に入れておく
イーサリアムでは6回のハードフォークが発生しており、そのうちの1回はチェーンスプリットを引き起こし、イーサリアムクラシック(ETC)というイーサリアムとは別のブロックチェーンの創設に至っています。
こういうことが起きるのに、安全性とか、透明性とか、本気で言ってんのか?!
イーサリアムネットワーク内のマイニングノードは、イーサッシュ(Ethash)と呼ばれる、独自のプルーフ・オブ・ワーク(proof of work/PoW:作業による証明)アルゴリズムを用い、互いに競うようにしてブロックを生成しています。
イーサッシュというアルゴリズム。頭の片隅
時には、2人のマイナーがほぼ同時にブロックを生産することがあります。その場合も、メインのブロックチェーンにはただ1つのブロックのみが受理されます。
受理されなかったほうのブロックはアンクル(uncle:叔父)ブロックと呼ばれます
アンクルブロックのマイナーは通常ブロックの場合より少ないブロック報酬を受け取りますが、そのトランザクションはステートツリーを変更しません。
ビットコインとは明らかに違う。
ブロックを伸ばした瞬間にコントラクトが走ると、多重実行の恐れがあるためだと勝手に解釈してとりあえず進める
ブロックチェーンにアンクルブロックを含めることでブロックチェーンのセキュリティを高められているのは、受理されなかったブロックの作成に使われたハッシュパワーが浪費されていないからです。ネットワーク難易度は、ブロックが15~30秒ごとに生産されるよう、常に調整されています。
はー、なるほど。
ブロックが15~30秒で伸びるってことは、ビットコインに比べてWoPの難易度が低いことになる。
つまり、アンクルブロックが作られる可能性も高まる
トランザクションはイーサを送信し、スマートコントラクトをデプロイするか、あるいは既存のスマートコントラクト上で関数を実行します。
オプションとしてdataフィールドを含めることが可能です。コントラクトをデプロイするトランザクションの場合、dataはコントラクトをバイトコードで表現したデータとなります。スマートコントラクトに送信されるトランザクションの場合、dataは呼び出す関数の名前と引数とを含みます。
んー?よくわからん
コントラクトはデプロイされる
デプロイされる際に実行可能なバイナリになるので、それがdataとしてトランザクションに含まれる
デプロイしない場合でも、既存の関数を実行することができる
って感じ?
トランザクションと関数は別々の場所にあって、
トランザクションはトリガーと実行するコントラクトの情報を持っているに過ぎない?
EVM用の独自オプコードのそれぞれが自身の手数料を持つということは、上手く書かれたコントラクトの実行はより安価となるということを意味します。例えば、SSTORE演算はデータをステートツリーに格納しますが、これは高価な演算となっており、その理由は全ネットワークへデータを複製しなければならないからです。
ガス代ってそうやって決まるのか!
イーサリアムの主要データベースはステートツリー(state tree:状態木)であり、Keccak256ハッシュのキーを32バイトの値に対応させるキー/値のペアによって構成されます。
約280以上のエントリーを超えると、ハッシュが衝突するため、ステートツリーの状態が利用に適しているとはいいがたいものとなります。
かなり複雑な処理でも実現は可能そう。
ステートツリーにデータを保存することはいちじるしい量のガスを消費するためです。
コントラクトは、ステートツリーに行う挿入や更新の数を最小にするように、注意深く書かれるべきです。
けど、まあお高いよね。
インターネットは、もともと、中央当局のどこを攻撃しても陥落させることができない非中央集権的なコミュニケーションネットワークとして、DARPA(アメリカ国防高等研究計画局)によって設計されました。
その後の15年間でWebがより商業的になるにつれ、中央集権の度合いも増してきました。
当初はWeb3.0に近かったけど、利用しやすいようにしたらWeb1.0~Web2.0に近づいたって話かな?
イーサリアムネットワークは、認証・コントラクトデータ保存・APIといった、サーバーの伝統的な責務のすべてに対応しています。
これだけ聞くと、既存のシステムはdappで実現できる。って読み取れる
Ethereum最凶の脆弱性をコントラクト実行の仕組みから読み解く&検査ツール紹介 | GMOインターネットグループ研究開発本部(次世代システム研究室)
Ethereum最凶の脆弱性をコントラクト実行の仕組みから読み解く&検査ツール紹介 | GMOインターネットグループ研究開発本部(次世代システム研究室)
リエントランシーとは、不正に再帰的な関数実行を引き起こす脆弱性
あの、The DAO事件のやつですな。
Ethereumの世界で主体となるのがアカウントです。送金するのもアカウント、コントラクトを実行するのもアカウント、そしてコントラクトもアカウントです。
・EOA(外部所有アカウント):一般的に想像するところのアカウントがこれです。アドレスで識別し、送金したりされたりします。
・コントラクトアカウント:コントラクトの実体で、EOAと同じようにアドレスや通貨残高を持ちます。
コントラクト自体が残高を持つのか!
残高以外にも、実行コードや、データストアも持っているみたい。
Ethereumでアカウントが出来ることを挙げてみると、大きく以下の3点があります。
・送金
・コントラクト実行
・コントラクト生成
この3つは全部トランザクションによって実現されます
すべてトランザクションなのか。
送金はイメージできるけど、それ以外がピンとこない。
ウォレットアドレスをブロックチェーン上に書き込むための手順って意味かな
攻撃の流れ
処理順序が直列にしか行われないことに驚いた。
被害コントラクトと攻撃コントラクトがあったとして、
被害コントラクトの処理によって新たなトランザクションが生まれた際に、
新たなトランザクションは新たなトランザクションで処理が進むことで攻撃コントラクトが実行され、
被害コントラクトは被害コントラクトで次の処理に進むのかと思ってたけど、
被害コントラクトの送金処理が実行されると、そこで被害コントラクトの処理から攻撃コントラクトの処理に移る。
これによって、被害コントラクトの後続処理にあった整合性を保つための処理が実行されない。
再帰的なアクションを起こされたらずーっと整合性が取れないままになってしまう。
リエントランシーの対策方法
・状態変数を変更したあとでトランザクションを実行することを徹底する
・送金時のgas量を制限する
脆弱性を作らない、作ったとしても実行され続けないようにgas代を小さくしておくってことね。
再起処理は何度も何度も送金処理が発生することで、gas代がかかりそうやもんなー
【レッスン②】イーサリアムのアカウントとトランザクション構造 | 【PoL(ポル)】仮想通貨・ブロックチェーンを基礎から学習するならPoL(ポル)
【レッスン②】イーサリアムのアカウントとトランザクション構造 | 【PoL(ポル)】仮想通貨・ブロックチェーンを基礎から学習するならPoL(ポル)
ビットコインがウォレットに紐づくBTCの金額をUTXOによって算出している一方、イーサリアムはアカウントという仕組みを構築しています。
最初からウォレットのような管理するための存在があって、それがアカウントなのか。
我々は普段、ウォレットを使って他者へイーサを送金していますが、このウォレットに紐づくアカウントがEOAです。
ウォレットはウォレットとしてあって、紐づくのがアカウント。
ふむ。分かるようで分からん。
ウォレットという名のキーペアの位置を表すのがアカウントって感じなのか、
ウォレットの各種情報をもった情報としてブロックチェーン上にあるのがアカウントなのか。
秘密鍵によって制御され、「0x」で始まるウォレットアドレスを持つ仮想通貨ウォレットだと認識されているものの実態になります。
あー少し理解が進んだかも。
アカウントという大きなくくりの中に、
ユーザがイーサ交換をするためのウォレットの役割をするアカウントがあるということか。
スマートコントラクトの実行コードを有しているのがコントラクトアカウント
秘密鍵を有しておらず、スマートコントラクトによって制御されます。
ウォレットとしての役割を持たないアカウントは代わりにコントラクトを持っているから、
コントラクトアカウントって感じか。
この情報から、このアカウントはトランザクションでしか操作が行われないのではないか?
このアカウントに入金したら、コントラクトで出金ロジックがない限り出金出来なさそう。
コントラクトアカウントには秘密鍵が存在しないため、トランザクションを開始することはできません。
やっぱそうやんな。送金の起点にはできないよね
表面的にはガスはイーサによって支払われますが、内部構造的にはガス=イーサ(ETH)ではありません。
ガスは、イーサリアム内でイーサとは別の概念として存在する独自の仮想通貨であり、イーサリアム世界の外には出てこないものになります。
イーサで買えるけど、イーサのブロックチェーン上でしか使われない物って感じかな。
スマートコントラクトを作成し実行する - Ethereum入門
スマートコントラクトを作成し実行する - Ethereum入門
コンパイル済みコードをEthereumネットワークに送信し、採掘者によってブロックチェーンに登録してもらって初めて他のユーザーがこのContractにアクセス出来るようになります。
コントラクトがどこにあるのか不思議やったけど、ブロックチェーン上に存在してるのか。
ということは、基本的にはすべてのノード上にコントラクトの実行ファイルが展開されて、すべてのノード上で状態が共有されるはず。
採掘者が採掘を終える前のmyContractの内容を表示してみると、myContractのアドレスが未定になっています。
address: undefined がそれかな。
マイナーの手元にある未処理トランザクションのときは、まだアドレスが付与されてない。
アドレスが付与されたらハッシュ値も一致しなくなりそうやし、とりあえずアドレスなしで進めるってことなんかな。
しばらくして採掘が成功すると、contractのアドレスが付加されています。
これはどうやって付与されたのか。
マイニングに成功したらってことは、ブロックチェーンに登録されたらってことやろうし、
ブロックチェーンのマイニングに成功したノードが何かしらのルールに従ってアドレスを付けるんやろうな。
他のユーザーに自身の作成したスマートコントラクトを利用してもらうためには、以下の2種類の情報を他のユーザーに伝える必要があります
・Contractのアドレス
・ContractのABI (Application Binary Interface)
Contractのアドレスの名前の通り、コントラクトがあるアカウントのアドレスなのは分かる。
ContractのABIはどんな関数があるか、どんな引数が必要か、みたいな情報が分かるものらしい。
IDEが作ってるINDEXみたいな感じで、スキーマ情報とも言えそう。
addresses - How is the address of an Ethereum contract computed? - Ethereum Stack Exchange
addresses - How is the address of an Ethereum contract computed? - Ethereum Stack Exchange
とりあえずコントラクトの送信者や、noceなどなどをこねくり回して作るってことは分かった。
結果的に、誰が作ったのかと、どのブロックに含まれるかによって決まりそう。
細かくは見てないけど、同じ作成者から同じブロックに2つのコントラクトを混ぜるとややこしいことになりそうやなーという印象。
Chainlink(チェインリンク)とは?分散型オラクルを実現する有力プロジェクト │ BaaS info !!
Chainlink(チェインリンク)とは?分散型オラクルを実現する有力プロジェクト │ BaaS info !!
既存のブロックチェーンは、オンチェーンとオフチェーンの接続性に欠けています。スマートコントラクトは、同一ネットワーク内のデータにしかアクセスできず、オンチェーン上のデータを外部に送信することもできません。
外部のデータソースとブロックチェーンの通信を可能にする「オラクル」(Oracle)です。
これが外部のデータをトリガーにしてスマートコントラクトを動かすやつかな?
オラクルとは、スマートコントラクト(オンチェーン)と、そのトリガーとなるオフチェーンのデータソースを接続するミドルウェアです。
オンチェーンとオフチェーンってのがあるってのが前提か。
Chainlinkのエコシステムにおいて、オラクルノードは自身のコンピューティングリソースを使って処理を行い、外部データをスマートコントラクトに伝達します。分散型オラクルであるため、特定のデータについて複数のオラクルノードがデータを提供しており、それらがアルゴリズムに従って集約され、スマートコントラクトで使われるデータとなっています。
オフチェーンって名前やけど、ブロックチェーンとは違うっぽい?
分散型システムではあるが、協調のロジックはアルゴリズムに従う感じなんかな
Chainlinkネットワーク上で稼働している21のオラクルノードが提供する価格データのリストから、「Quickselect」というアルゴリズムを用いて正しい回答が決定される
ふむ、アルゴリズム
Chainlinkのエコシステムではネイティブトークン「LINK」が流通しており、オラクルノードを運営するオペレーターへの報酬(インセンティブ)として機能しています
トークンってことは、ブロックチェーンの上ではありそう。
Chainlinkには評価システムが導入されており、正しく振る舞ったオラクルノードの評価スコアが上昇していきます。
正しいノードに期待する みたいなのが想像されるパターンかな
誰でもオラクルノードになれますが、スマートコントラクトの開発者は、オラクルノードに対して情報提供の条件として、任意の金額をデポジットすることを要求可能
?
オフチェーンの利用にあたって、コントラクトがノードにトークンを要求するの?
データを管理してくれてありがとう。じゃなくて?
不正行為や誤ったデータの提供、タスクを完了する前にオフラインになると、オラクルノードはペナルティとしてデポジット分が没収されてしまいます
あーなるほど。オフチェーンのノードを信用するのは、トークンへの信用とするわけか。
分散型オラクルの課題としては、フリーローディング(freeloading)問題が挙げられます。
あるオラクルが伝えたデータを他のオラクルノードが観測できる場合、他のノードはコスト無しでデータを提供できてしまう
フリーロードが行われると、分散型オラクルで担保されるはずのデータの多様性も失われてしまいます
多様性ってのは意識してなかったけどなるほど。
他のノードの振る舞いを模倣する偽物を作ってネットワークに放り込んでしまえば、
データを得るためのコストなしに実現できるんか。
参考
スマートコントラクトとは何か? その仕組みや事例、実装への課題を解説 |FinTech Journal
スマートコントラクトとは何ですか? | Coinbase
Bplus53_小特集_解説_スマートコントラクト_三久.indd
イーサリアムでスマートコントラクトを開発したいとき、最初に押さえておくべき用語と概念は?:CodeZine(コードジン)
Ethereum最凶の脆弱性をコントラクト実行の仕組みから読み解く&検査ツール紹介 | GMOインターネットグループ研究開発本部(次世代システム研究室)
【レッスン②】イーサリアムのアカウントとトランザクション構造 | 【PoL(ポル)】仮想通貨・ブロックチェーンを基礎から学習するならPoL(ポル)
スマートコントラクトを作成し実行する - Ethereum入門
addresses - How is the address of an Ethereum contract computed? - Ethereum Stack Exchange
Chainlink(チェインリンク)とは?分散型オラクルを実現する有力プロジェクト │ BaaS info !!
更新履歴
#2022/07/27 いったんおわり
#2022/06/28 かきはじめ