ブロックチェーンのトピックに興味がある人は、ロシア系カナダ人のプログラマーであるヴィタリク・ブテリン- イーサリアムのプロジェクトについて、そしてそれを使っていわゆるスマートコントラクトについてすでに何度も聞いています。 このシリーズの記事では、Ethereumの本質、スマートコントラクト、ガスの概念をできるだけ簡単に説明し、スマートコントラクトがどのように書かれているかを示します。
スマートコントラクトとガス
指で言うと、「スマートコントラクト」はブロックチェーン内にあるコードです。 ネットワークメンバーは、少額の料金で電話をかけることができます。 このボードはガスと呼ばれ、文字通り「燃料」です。 なぜこれが必要なのですか? 鉱夫を彼の資源の詐欺師による虐待から保護するため。
知っている人はほとんどいませんが、ビットコインでさえこれらの契約を書く機会はありますが、何らかの理由でそれに関与する人はほとんどいません。 主な問題の1つは、 スクリプト言語がチューリング完全ではなく、多かれ少なかれ深刻なことを書くのは簡単ではないということです(問題の規模を理解するために、ループを追加する機会すらありません)。 イーサリアムの場合、すべてがわずかに異なり、チューリング言語は完全であり、誰かが次の形式の契約を書くリスクがあります
// foo = 0; while (True) { foo++; }
この契約を開始した鉱山労働者はすぐには終了せず、実際にはどこにも資源を費やさないことは明らかです。 それが起こるのを防ぐためです、イーサリアムの開発者はガスを思いつきました-実際には、私が書いたようなコードを立ち上げることは単に経済的に不便です。
Gasでコントラクトを呼び出すコストは非常に簡単に計算できます。完成したコードをコンパイルして、一連のアセンブラーコマンドの形式で提示できます。 これはオンラインコンパイラです 。既にサンプルコードがあります。[ コンパイル ]> [ 詳細の切り替え] > [ アセンブリ ]をクリックします。 各チームにはハードコーディングされた値があります。
現時点では、1つのガスのコストは50 wei、つまり50 * 10 ^ -18エーテルです。
環境
Ethereumでの作業を開始するために、現在のブロックチェーン全体を同期する必要はありません-プラットフォームは、いわゆる「プライベートブロックチェーン」を簡単に作成できるようにします。 これは、チェーン全体をダウンロードするのに数日かかるだけでなく、実際のお金を支払わずに契約で遊ぶことができるため(そして、ブロックチェーンへの契約のダウンロードを含むガスを支払わなければならない)、合理的です。
イーサリアムクライアントコマンドラインのインストール
Gethを使用します 。 Goで書かれており、ほとんどの記事で使用することをお勧めします。 公式ドキュメントはこちらです。
sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum
他のOSのインストール手順については、 こちらをご覧ください 。 ここで、他のクライアント実装を見つけることができます-C ++またはPython。
ノードを上げる
始めるには、ターミナルでgeth
と書くだけです。 このコマンドは、ノードを起動してメインブロックチェーンで動作し、ブロックの同期を開始します。 これは行いませんが、本当に必要な場合は、 geth --fast --cache 1024
を使用することをお勧めします。 重要な点---fastフラグを使用すると、ブロックヘッダーのみをダウンロードできます。インターネットによると、30分で500,000ブロックをダウンロードできます。これは、従来の同期よりも1桁高速です。 ただし、このフラグなしで既にダウンロードを開始している場合は、すべてを削除してからやり直す必要があります。 詳細はこちら 。
私たちの主なオプションはコンソールです。これにより、gethをインタラクティブに操作できます。 また、プライベートブロックチェーンモードでgethを実行する--devフラグも使用します。 geth --dev console
。 gethの複雑さについて十分に理解していると仮定します。 例として、以下はマイナーと連携するためのコードです。あなたはすべてを自分で理解すると思います。
> personal.newAccount("123") // "123" "0x07ae7ebb7b9c65b51519fc6561b8a78ad921ed13" // > eth.accounts // ["0x07ae7ebb7b9c65b51519fc6561b8a78ad921ed13"] > miner.setEtherbase(eth.accounts[0]) // true > eth.coinbase // "0x07ae7ebb7b9c65b51519fc6561b8a78ad921ed13" // > miner.start() // , 31,32,... true I1005 09:25:44.363901 miner/miner.go:136] Starting mining operation (CPU=2 TOT=3) I1005 09:25:44.364247 miner/worker.go:539] commit new work on block 31 with 0 txs & 0 uncles. Took 291.8µs I1005 09:25:45.049267 miner/worker.go:342] Mined block (#31 / 4ca861c2). Wait 5 blocks for confirmation I1005 09:25:45.049567 miner/worker.go:539] commit new work on block 32 with 0 txs & 0 uncles. Took 133.101µs I1005 09:25:45.049976 miner/worker.go:539] commit new work on block 32 with 0 txs & 0 uncles. Took 121.3µs I1005 09:25:45.632474 miner/worker.go:342] Mined block (#32 / f79f0df7). Wait 5 blocks for confirmation I1005 09:25:45.632796 miner/worker.go:539] commit new work on block 33 with 0 txs & 0 uncles. Took 182.601µs I1005 09:25:45.632915 miner/worker.go:539] commit new work on block 33 with 0 txs & 0 uncles. Took 86.9µs I1005 09:25:46.441888 miner/worker.go:342] Mined block (#33 / 16e99579). Wait 5 blocks for confirmation I1005 09:25:46.442257 miner/worker.go:539] commit new work on block 34 with 0 txs & 0 uncles. Took 268.9µs I1005 09:25:46.442440 miner/worker.go:539] commit new work on block 34 with 0 txs & 0 uncles. Took 120.201µs > miner.stop() true > eth.getBalance(eth.coinbase) // 15000000000000000000
気配りのある読者は、書かれたものはすべて疑わしくJSに似ていることに気付きました-これがそれです。 以下は、残高のある口座を人間が読める形式で表示する機能コードの例です。
function checkAllBalances() { var totalBal = 0; for (var acctNum in eth.accounts) { var acct = eth.accounts[acctNum]; var acctBal = web3.fromWei(eth.getBalance(acct), "ether"); totalBal += parseFloat(acctBal); console.log(" eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether"); } console.log(" Total balance: " + totalBal + " ether"); };
このコードをgeth_scripts.jsに保存して実行します。
> loadScript("geth_scripts.js") true > checkAllBalances() eth.accounts[0]: 0x07ae7ebb7b9c65b51519fc6561b8a78ad921ed13 balance: 15 ether undefined
Gethのエキスパートとして認められたので、静かにコンソールを閉じて、白人としてGUIの使用を開始できます。
ミストウォレット
ミストは、イーサリアムにとって最も一般的な財布です。 リリースページからインストールファイルをダウンロードするだけでインストールできるように、クロスプラットフォームのMeteorを使用して記述されています 。
これまで、契約を処理できるいわゆるライトウォレットは存在しないため、Mistが最初に提供するのは、メインネットワークまたはテストネットのいずれかを同期することです。 このすべてはまだ必要ありません。プライベートブロックチェーンでMistを起動します。 とても簡単です:
geth --dev --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" console mist.exe --rpc http://localhost:8545
最初の行は以前と同じことをすべて行いますが、今回はHTTP-RPCサーバーもデフォルトでhttp:// localhost:8545で開きます。 rpcapiフラグは、サーバーへの接続後にMistが持つ許可のセットを定義します。 この場合、すべてがすべて示されます。 たとえば、個人を指定しない場合、Mistは新しいアカウントなどを作成できません。 コマンドラインオプションの全体がここにリストされています 。
2行目は、指定されたRPCサーバーでMistを開始します。 すべてが正常に機能した場合、起動時にPrivate-netが表示されます。
こんにちは世界!
最初の契約を作成します。 これを行うには、[ 契約 ]> [ 新しい契約のデプロイ ]をクリックします。
Solidity契約のソースコードウィンドウで、次のように記述します。
contract mortal { /* */ address owner; /* - owner , */ function mortal() { owner = msg.sender; } /* selfdestruct , */ /* Ethereum */ function kill() { if (msg.sender == owner) selfdestruct(owner); } } /* is */ /* contract_1 is contract_2, contract_3*/ contract greeter is mortal { string greeting; /* - "Hello, world!"*/ function greeter(string _greeting) public { greeting = _greeting; } // "Hello, world!" function greet() constant returns (string) { return greeting; } }
言語自体は非常にシンプルです。ここにそのドキュメントがあります 。多くの質問は既にethereum.stackexchange.comで議論されています。原則として、 gitterで答えを得る機会があります。
ブロックチェーンにダウンロードして契約を開始する
グリーティングコントラクトを選択し、引数として「Hello、world」を指定し、[ 展開 ]をクリックしてパスワードを入力すると、ブロックチェーンでのみコントラクトを「マイニング」できます。 これを行うには、Gethをオンにして5月にいくつかのブロックを指定してターミナルを開きます(これを行う方法は上記で説明しています)。 以上です!
[ 契約 ]タブに移動すると、 GREETER 7D5Dなどの名前の新しい契約が表示されます。 クリックして結果を楽しみます。 必要に応じて、右側のドロップダウンリストで[キル]機能を選択して、彼を殺すことができます。
PS私の最初の記事はひどくscられました。 次の部分では、暗号通貨の記述、EVMのニュアンスについての説明、Ethereumへのブラウザーインターフェイスの固定方法などを説明します。 健全な批判を歓迎します、見てくれてありがとう:)