ブロックチェーン開発(パート2)最初のEthereumスマートコントラクトのデプロイと実行 インターネット上にはスマート コントラクトのデプロイに関する記事が多数ありますが、それらにはすべて、コマンド ラインを使用してデプロイされるという共通点があります。まず、SOLC コンパイル環境が確立され、次に Geth または Eth ノードがデプロイされ、その後、デプロイのためにウォレット、ABI、およびコントラクト アドレスが段階的に生成されます。これは初心者には理解しにくく、失敗しがちです。この記事では主に、グラフィカル インターフェイスでワンクリックでスマート コントラクトをデプロイして呼び出す方法を紹介します。 1. スマートコントラクトとDAPPの概要 1. スマートコントラクトの基本概念 スマート コントラクトは、Ethereum ネットワーク上で展開および実行できるコードとデータのコレクションです。例えてみると、スマート コントラクトは JAVA プログラムに似ています。 JAVA プログラムは、コードをバイトに解釈し、JAVA 仮想マシン (JVM) を介して実行します。 Ethereum のスマート コントラクトは、Ethereum 仮想マシン (EVM) を介して実行するためにバイトコードに解釈されます。アセンブリを学習したことがあれば、コンパイルされたバイトコードがアセンブリと非常に似ていることに気付くでしょう。同時に、スマートコントラクトは独自のアカウントを持ち、相互の情報の送信やアカウント情報などのブロックチェーンのステータスの変更など、時間やイベントによって駆動されるいくつかの機能を自動的に実行できます。 Ethereum のスマート コントラクトの最大の特徴はチューリング完全性です。簡単に言えば、コンピューターが実行できるすべてのことを完全にシミュレートできます。よく知られているビットコインは、実際にいくつかの簡単なスクリプトを実行できますが、チューリング完全ではありません。たとえば、ビットコインはループ命令を実行できません。 イーサリアム仮想マシン (EVM) Ethereum 仮想マシン (EVM) は、Ethereum のスマート コントラクトのランタイム環境です。サンドボックス化されているだけでなく、実際には完全に分離されているため、EVM 内で実行されているコードはネットワーク、ファイル システム、またはその他のプロセスにアクセスできず、スマート コントラクト間の呼び出しは制限されます。 2. DAPPの基本概念 初心者はスマートコントラクトと DAPP を混同することがよくあります。 Ethereum コミュニティでは、スマート コントラクトに基づくアプリケーションを分散型アプリケーション (Decentralized Apps) と呼んでいます。 DApp の目標は、スマート コントラクトに使いやすいインターフェースを提供し、さらにユーザーにとって有益な追加機能を提供することです。典型的な DApp の例は、HTML インターフェース、Web3 ランタイム ライブラリ、JS コード、およびブロックチェーンにデプロイされたスマート コントラクトで構成されます。一般的な CS アーキテクチャの Web サイトとは異なり、DApp は通常のサーバーでは実行できません。 DApp は、Ethereum ノードと対話できるサーバー上、または任意の Ethereum ノード上で実行する必要があります。 DApp は、ブロックチェーン ネットワークにトランザクションを送信することで対応するスマート コントラクトと対話し、(MYSQL データベース) などの集中型データベースではなく、ブロックチェーン ネットワークから重要なデータを読み取ります。一般的な BS アーキテクチャのユーザー ログイン システムとは異なり、Ethereum ユーザーは 16 進アドレスとして表され、すべてのユーザー データとその他のデータはローカルに保存されます。これは、現在の Web アプリケーション アーキテクチャとは大きく異なります。 3. スマートコントラクト高水準言語 ユーザーが Ethereum 仮想マシン (EVM) バイトコードを直接記述することは不可能であるため、Ethereum ではスマート コントラクトを記述するための高水準言語がいくつか提供されています。 Solidity: JavaScript と同様に、これは Ethereum が推奨する主力言語であり、最も人気のあるスマート コントラクト言語です。具体的な使用方法については、Solidity のドキュメント (https://solidity.readthedocs.io/en/latest/) を参照してください。 Serpent: Python スタイルに似ています。ドキュメント アドレス: https://github.com/ethereum/wiki/wiki/Serpent LLL: Lisp のようなスタイルですが、現在は廃止されています。 さまざまな習慣に応じて、さまざまな高級言語を選択できます。最も人気があるのは Solidity です。 2. Ethereumプライベートチェーンに最初のスマートコントラクトをデプロイする この記事のスマート コントラクトは、ブロックチェーンに数値を保存し、それを読み取ることができる機能を持つ Ethereum の公式サンプル コントラクトを使用します。コードは次のとおりです。 契約SimpleStorage { uint 保存されたデータ; 関数set(uint x) { 保存されたデータ = x; } 関数 get() は定数 (uintretVal) を返します { 保存されたデータを返します。 } } Solidity言語を学習していなくても、コントラクトのset関数がX変数に数値を格納し、get関数がX変数から数値を読み取ることが大まかにわかります。この契約の展開は次のとおりです。 1. プライベートチェーンを開始する Ethereum プライベート チェーン Geth と Ethereum-Wallet グラフィカル インターフェイスを起動します (この記事では、Geth バージョン 1.41 と Ethereum-Wallet バージョン 0.8.1 を使用します)。始め方が分からない方は前回の記事「ブロックチェーン開発(I)イーサリアムをベースにしたプライベートチェーン環境の構築」を参考にしてください。起動後のインターフェースは以下のようになります。 Ethereum-Wallet に赤い PRIVATE-NET マークが表示されます。 2. ウォレットを2つ作成する ウォレットを追加するには、「アカウントを追加」ボタンをクリックします。プログラムはダイアログ ボックスをポップアップし、パスワードを 2 回入力するよう要求します。パスワードを入力すると、アカウントが正常に作成されます。同じ操作で他のアカウントを作成します。上のスクリーンショットから、3つのアカウントがあることがわかります。1つはMAIN ACCOUNT、1つはACCOUNT2、1つはACCOUNT3です。 3. イーサを得るために採掘する アカウントが作成された後、Ethereum はまだ存在しないため、プライベート チェーンでマイニングする必要があります。 Gethインターフェースに切り替えて入力してください マイナー.開始(1) miner コマンドの括弧内の 1 は、マイニングに 1 つのスレッドを使用することを意味します。設定されていない場合、CPU はフルスピードで動作し、コンピューターの使用に影響します。 しばらく実行すると、メインアカウントは大量のイーサリアムを取得します。このとき、画面はすぐに更新されます。ご心配なく。マイニングを停止するには、コマンド miner.stop() を入力します。 4. イーサリアムをあるウォレットから別のウォレットに転送する まず、ACCOUNT2 アカウントをクリックしてアカウント詳細インターフェイスに入り、右側の「アドレスをコピー」をクリックして、ACCOUNT2 のアドレスをコピーします。システムは、現在テスト ネットワークにいることを通知します。そのため、このアカウントに実際の Ethereum を転送しないでください。 ウォレットの「送信」ボタンをクリックして、一定量のイーサをMAINACCOUNTからACCOUNT2に転送します。同時に、このトランザクションを実行するための手数料が 0.00042 イーサであることがわかります。
「送信」をクリックすると、パスワードの入力を求められますが、まだ正常に送信されていません。ブロックチェーンの取引ルールによれば、マイナーからの確認が必要であり、各取引には12ブロックの確認が必要であり、1つのブロックの生成には16秒かかります。 Geth プログラムに切り替えて、ACCOUNT2 に 100 イーサが表示されるまでマイニング コマンドを入力し、その後マイニングを停止します。 5. スマートコントラクトを導入する 「CONTRACTS」をクリックしてスマートコントラクト管理インターフェースに入り、「DEPOLY NEW CONTRACT」をクリックしてスマートコントラクトのデプロイを開始し、スマートコントラクトをデプロイするアカウントを選択して、以下に示すようにスマートコントラクトコードを入力します。 情報を入力したら、「DEPLOY」をクリックします。スマート コントラクトの導入には手数料がかかるため、システムからアカウントとパスワードの入力を求められます。
現時点では、デプロイされたスマート コントラクトは表示されません。 Geth インターフェースに切り替えてマイニングを開始します。 12 ブロック後、スマート コントラクトが確認され、表示されます。 3. スマートコントラクトの実行 1. このノードでスマートコントラクトを実行する 「CONTRACTS」をクリックしてスマート コントラクト インターフェイスに入ると、先ほどデプロイされたスマート コントラクト「SimpleStorage」が表示されます。クリックしてスマート コントラクトに入り、詳細インターフェイスに入ります。この詳細インターフェイスには、スマート コントラクトの書き込み領域と読み取り領域があります。まず、Geth マイニングを開始し、次に書き込み領域で対応するスマート コントラクト関数 SET を選択し、下の値入力ボックスに設定する値を入力します。しばらく実行すると、読み取り領域のスマート コントラクト関数 GET の Retval の戻り値が変更されていることがわかります。 他のスマート コントラクトの動作は、機能と入力が増えることを除いて同じです。
2. 他のノードでスマートコントラクトを実行する この時点では、スマート コントラクトは自分だけが閲覧でき、他の人は閲覧したり実行したりすることはできません。デプロイしたスマート コントラクトを他のユーザーが実行したい場合は、他のチュートリアルで説明されているスマート コントラクトの ABI とアドレスなどの情報を提供する必要があります。 先ほどデプロイされた「SimpleStorage」スマート コントラクト インターフェースに入ります。右側に4つのボタンがあります。 A. 「Eherを入金」: このスマートコントラクトにEtherを送信する B. 「アドレスをコピー」: スマートコントラクトのアドレスをコピーします C. 「QRコードを表示」:QRコードを表示します。携帯電話でスキャンすると、スマートコントラクトのアドレスが表示されます。 D. 「インターフェースを表示」: スマートコントラクトのJSONインターフェース、つまりABIを表示します。 まず、「アドレスをコピー」をクリックしてスマート コントラクトのアドレスをコピーし、「インターフェイスを表示」をクリックしてスマート コントラクトのすべての JSON インターフェイスをコピーし、スマート コントラクトを実行する必要がある別のノードで Ethereum-Wallet を開き、「コントラクト」インターフェイスを開いて「コントラクトを監視」をクリックし、スマート コントラクトを追加します。 上図のように、CONTRACT NAME を任意に記入し、CONTRACT ADDRESS にスマートコントラクトのアドレスを記入し、JSON INTERFACE の「Show Interface」に先ほどコピーした内容を入力します。 「OK」をクリックすると、スマート コントラクトが表示され、実行できるようになります。 4. スマートコントラクトの導入原則 1. スマートコントラクトの展開アーキテクチャ この記事で紹介したスマート コントラクトのデプロイメントは、グラフィカル インターフェイスでコンパイルおよび実行されますが、実際にはバックグラウンドで Geth を実行しているノードに主に依存しています。現時点では、Geth はグラフィカル インターフェイスでウォレットにブロックチェーン情報を提供するための RPC インターフェイスを提供しています。 RPC インターフェース Geth はポート 8545 で JSON RPC API を提供します。データ転送は JSON 形式を使用し、Mist やその他のグラフィカル クライアントなどのフロントエンドにブロックチェーン情報を提供するなど、Web3 ライブラリのさまざまなコマンドを実行できます。デフォルトのアクセス アドレスは http://localhost:8545 です。 スマート コントラクトをデプロイすると、Ethereum-Wallet は最初に SOLC スマート コントラクト コンパイラを呼び出してコードを EVM バイトコードにコンパイルし、次に Geth の RPC インターフェイスを介して Ethereum ネットワークに EVM バイトコードを送信します。ネットワーク全体で検証後、Gethが管理する各ブロックチェーンに同時に書き込まれます。アーキテクチャは次のとおりです
2. 展開データフロー まず、コードは SOLC によってバイナリ コードにコンパイルされ、次にトランザクションを通じてスマート コントラクトが作成されます。トランザクションには、作成者のアカウント、スマート コントラクトの内容、スマート コントラクト アドレスなどのいくつかの重要な情報が含まれます。スマートコントラクトアドレスは、作成者のアカウントと送信されたトランザクションの数を乱数入力として生成し、Kecca-256暗号化アルゴリズムを通じてアカウントとして新しいアドレスが作成されます。
デプロイメントプロセス中は、デプロイメントにトランザクションが必要であり、データをブロックチェーンに保存する必要があるため、GAS を使用する必要があります。 取引 トランザクションとは、あるアカウントから別のアカウントに送信されるメッセージです。トランザクションにはバイナリ データ (ペイロード) とイーサを含めることができます。 対象アカウントにコードが含まれている場合は、コードと入力データが実行されます。 宛先アカウントがゼロアカウント(アカウントアドレスが 0)の場合、トランザクションによって新しいコントラクトが作成されます。前述の通り、このスマートコントラクトアドレスはゼロアドレスではなく、コントラクト作成者のアドレスとこのアドレスによって発行されたトランザクションの数から計算されます。契約作成トランザクションのペイロードは、EVM バイトコードとして実行されます。実行の出力はコントラクト コードとして永続的に保存されます。つまり、コントラクトを作成するには、実際のコントラクト コードをコントラクトに送信するのではなく、実行可能なコードを返すコードを送信します。 ガス Ethereum 上のすべてのトランザクションには一定量のガスが課金されます。その目的は、トランザクションの実行に必要な作業量を制限するとともに、実行料金を支払うことです。 EVM がスマート コントラクトを実行すると、特定のルールに従ってガスが徐々に消費されます。実際、GAS は Ethereum の比較的小さな単位です。イーサリアムを100元に例えると、GASは1セントとみなすことができます。イーサリアムだけであれば、問題が発生します。イーサリアムは誰もが売買する必要があり、市場では価格変動が起こります。ビットコインのように、1 日で 50% 下落したり 50% 上昇したりする状況が発生する可能性があります。これは計算コストとしては許容できません。たとえば、今日足し算をすると 10 ドルかかりますが、明日足し算をすると 100 ドルかかります。したがって、分離するためにここでガスが導入されます。市場の変動とコンピューティングコストを切り離します。つまり、イーサとガスの間には交換レートがあるということです。ガス価格が下がれば、イーサが上昇しても問題ありません。これにより、同じ計算を行うときに、消費される法定通貨が一貫していることが保証されます。 ガス価格(イーサ)は、トランザクションの作成者によって設定されます。送信アカウントは、取引手数料 = ガス価格 * ガス量を前払いする必要があります。実行後にガスが残っている場合は、送信アカウントにガスが返金されます。 前の記事で述べたように、スマートコントラクトのデプロイには 0.00042 イーサが使用され、これは 21,000 ガスに相当します。 実行場所に関係なく、ガスが使い果たされると (たとえば、負の値に下がると)、ガス不足例外がトリガーされます。現在の呼び出しフレームによって行われたすべての状態変更はロールバックされます。 5. スマートコントラクトの仕組み スマートコントラクトはブロックチェーン上に展開されるコードです。ブロックチェーン自体はコードを実行することはできません。コード実行はローカル EVM で行われます。実際、ブロックチェーン上にデプロイされたコードは、ローカルで元のスマート コントラクト コードを生成できるコードです。ブロックチェーンはデータベースとして理解でき、クライアントはデータベースから保存されている実行コードを読み取り、ローカルで実行し、結果をブロックチェーン データベースに書き込みます。 本質的には、イーサリアムのウォレットもスマートコントラクトのアプリケーションです。 Ethereum はさまざまなアプリケーションを作成するためのプラットフォームです。次の記事では、スマート コントラクトの開発、記述、デバッグの方法について詳しく説明します。 |
<<: リップルラボのCTOがブロックチェーン技術に対する姿勢を変える
ABN AMRO 銀行の顧客は、銀行プロバイダーが提供するビットコイン ウォレットをまもなく使用でき...
よく知られた取引可能な仮想通貨として、ビットコインの過去1か月間の激しいパフォーマンスは特に注目を集...
多くの分散型アプリケーション開発者にとって、ブロックチェーンをオンライン識別および認証に適用すること...
ビットコイン専門家のスティーブ・パターソン氏は、マイナーが投票しないというOpenbazaar開発者...
最近、「ブロックチェーン」や「ビットコイン」といった仮想通貨用語が流行っています。犯罪者の中には、そ...
4月24日、中国サイバースペース管理局は国内ブロックチェーン情報サービス名と登録番号の第3弾224件...
投資家は今年初めから、連邦準備制度理事会の今後の利上げ政策に注目している。ウクライナ、ロシア、NAT...
暗号通貨に特化した初の査読付き学術誌「Ledger」が本日創刊されました。ピッツバーグ大学とMITメ...
昨夜は特に重要なニュースはありませんでした。それはロシアとウクライナの間の紛争に過ぎなかった。ロシア...
ビットコインは現在、世界の準備通貨である英国ポンド(GBP)の現金供給よりも流動性が高い。イングラン...
8月1日のメディア報道によると、被害者はWeChatグループを通じて利益誘導の指示を受け、指導を行う...
中国国営ラジオ牡丹江は4月10日(記者:馬俊偉、特派員:王安正)に、多くの住宅ガレージで60台以上の...
NVIDIA は最近、最新の財務諸表を発表しました。 NVIDIA CEOのジェンスン・フアン氏を驚...
著者: 北京市政府サービス管理局 / 出典: 北京市政府習近平総書記の重要演説「ブロックチェーン技術...
最近、暗号通貨市場で大規模な「ビットコインクジラ」が発見されました。ビットコインの大口投資家が、非常...