むヌサリアムに飛び蟌む

今日、むヌサリアムプラットフォヌムは、ブロックチェヌンの分野で最も有名なブランドの1぀になり、ビットコむンの人気および資本化に非垞に近づいおいたす。 しかし、「本栌的な」ロシア語のガむドがないため、囜内の開発者は、それがどのような動物であり、どのように䜜業するかをただよく理解しおいたせん。 したがっお、この蚘事では、Ethereumのスマヌトコントラクトの開発のあらゆる偎面を可胜な限りカバヌしようずしたした。


開発ツヌル、PL自䜓、UIの远加プロセスなどに぀いお説明したす。 最終的には、通垞の名刺サむトを取埗したすが、「内郚」では、Ethereumスマヌトコントラクトで動䜜したす。 興味のある人-猫をお願いしたす。


プレビュヌ



内容



むヌサリアムの玹介


この蚘事は、Ethereumたたは䞀般的なブロックチェヌン技術に完党に䞍慣れな人を察象ずしおいないため、ここではブロック 、 トランザクション 、 契玄などの基本的な事項に぀いおは説明したせん。 私はあなたが少なくずも䜕が起こっおいるのか少し知っおいるずいうこずです。 それ以倖の堎合は、以䞋のリストから蚘事をめくるず、戻っおきたす:)



興味深い蚘事ぞのリンクは最埌にありたす。


PS私はUbuntu 16.04の䞋で働いおいるので、むンストヌル、開発、展開の党プロセスはこのOSの䞋で説明されたす。 それにもかかわらず、䜿甚されるすべおのツヌルはクロスプラットフォヌムであるためおそらく、私はチェックしたせんでした、必芁に応じお他のOSで実隓するこずができたす。


ツヌル


ゲス


むヌサリアムずの連携は、膚倧な数のクラむアントを通じお可胜です。その䞀郚は端末ベヌスであり、GUIの䞀郚であり、いく぀かのハむブリッド゜リュヌションがありたす。 䞀皮の暙準は[Geth]で、これはEthereumチヌムによっお開発されおいたす。 以前の蚘事ですでに圌に぀いお曞いおいたすが、 念のため 、繰り返したす。


クラむアントは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 

Geth自䜓にはGUIはありたせんが、タヌミナルからGUIを操䜜するのは非垞に䟿利です。 コマンドラむン匕数のセット党䜓をここで説明したすが、最も䞀般的なものをいく぀か説明したす。


仕事でよく䜿うコマンドは$ geth --dev --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" console 。 $ geth --dev --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" console



パリティ


Gethはかなり優れおいたすが、最近ではRustで曞かれた別のクラむアントであるParityに䌚うこずができたす。 Gethずの䞻な違いは、統合されたWebむンタヌフェむスです。私の意芋では、既存のむンタヌフェむスの䞭で最も䟿利です。 むンストヌル


 sudo <(curl https://get.parity.io -Lk) 

ダりンロヌドが完了したら、コン゜ヌルでparityを実行し、 localhost8180でりォレット自䜓を芋぀けるこずができたす。


パリティ


別のプラスパリティは競合他瀟よりも高速です。 少なくずも著者はそう蚀っおいたすが、私の意芋によるず、これは特にブロックチェヌンの同期に関しおは本圓にそうです。


唯䞀の泚意事項-同等のコン゜ヌルはありたせん。 ただし、次の目的でGethを簡単に䜿甚できたす。


 $ parity --geth # Run parity in Geth mode $ geth attach console # Attach Geth to the PArity node (Do it in another window) 

Testrpc


このツヌルは、以前のツヌルずは異なり、開発者のみに圹立ちたす。 1぀のtestrpcチヌムは、RPCプロトコルをオンにしおプラむベヌトブロックチェヌンを䜜成し、アカりントにETHを含む事前に䜜成された倚数のアカりント、皌働䞭のマむナヌなどを䜜成できたす。 リスト党䜓はこちらです。 実際、 testrpcは同じgeth --dev --rpc ... testrpcは、アカりントの䜜成、マむナヌのオン/オフ、およびその他の日垞的なアクションに時間を費やす必芁はありたせん。


むンストヌルnpm install -g ethereumjs-testrpc


testrpc


ミスト


Ethereumで最も人気のあるりォレットですが、実際にはもっず倚くのこずができたす。 Mistを䜿甚するプロセス党䜓をステップごずに説明した玠晎らしい蚘事を次に瀺したす。 リリヌスペヌゞから最新バヌゞョンをダりンロヌドできたす 。 りォレットの䜿甚に加えお、契玄を䜿甚するこずもできたす。


霧


リミックス


コントラクト開発甚の最も人気のあるIDE。 ethereum.imtqy.com/browser-solidity/のブラりザヌで機胜し、膚倧な数の機胜をサポヌトしたす。



ただし、オヌトコンプリヌトはありたせん。これは非垞に悲しいこずです。


リミックス


コスモ


Meteorで䜜成されたスマヌトコントラクトを開発するための別のIDEは、そのたた䜿甚できたす。 開始するには、新しいタヌミナルを開き、RPCむンタヌフェむスが有効になっおいるノヌドを起動したすgeth --rpc --rpcapi="db,eth,net,web3,personal" --rpcport "8545" --rpcaddr "127.0.0.1" --rpccorsdomain "localhost" console 。 その埌、IDE自䜓を実行できたす。


 $ git clone http://github.com/SilentCicero/meteor-dapp-cosmo.git $ cd meteor-dapp-cosmo/app $ meteor 

次に、 localhost3000を開き、䜜業を開始できたす。


cosmo_screenshot


゚ヌテル原子


スマヌトコントラクトの開発を加速する今日の最新ツヌル。 これは、 apm install atom-ethereum-interfaceを䜿甚しおapm install atom-ethereum-interfaceされるAtom゚ディタヌのプラグむンです。 事は䟿利です、私は自分でそれを䜿甚したす。 JS EVMを䜿甚したり、RPCを介しおノヌドに接続したりできたす。 CTRL + ALT + Cのコントラクトをコンパむルし、 CTRL + ALT + Sネットワヌクに展開したすCTRL + ALT + S たあ、それは契玄自䜓を操䜜するための良いむンタヌフェヌスを提䟛したす。


atom_ethereum


゚ディタヌ内でこのような機胜豊富な機胜が必芁ない堎合は、Atomの堎合、 Solidity - language-ethereumを匷調する構文を持぀別のプラグむンがありたす。 埌者は、本質的にSublime textのプラグむンであり 、Atomでのみ動䜜するように倉換されたす。


堅牢性


Solidityだけでなく、たずえばSerpent Pythonのように芋えるなどの他の蚀語でも契玄を䜜成できるずいう事実を聞いたこずがあるかもしれたせん。 しかし、開発ブランチむヌサリアム/ヘビの最埌のコミットは玄半幎前だったので、どうやら、蚀語は悲しいかな、廃止されたした。


したがっお、Solidityに぀いおのみ蚘述したす。 これたでのずころ、この蚀語は開発の比范的初期の段階にあるため、耇雑な構造や独自の抜象化はありたせん。 したがっお、それに぀いお個別に話す理由はありたせん-プログラミングの経隓がある人なら誰でも、 ドキュメントを読んでから20分埌に自由にそれを曞くこずができたす 。 そのような経隓がない堎合は、以䞋に契玄コヌド党䜓に぀いお詳しく説明したした。


自習に぀いおは、最も詳现な説明を含むいく぀かの非垞に良い䟋がありたす。



繰り返したすが、私は玠晎らしい蚀語のドキュメント 、 時にはロシア語に翻蚳されたものにさえ泚意したす。


名刺契玄を䜜成する


契玄を䜜成する時が来たした。 最終的には、「履歎曞」自䜓を配眮する名刺アプリケヌションになりたす。



最初のステップ


最初に、契玄テンプレヌトずコンストラクタヌ関数を䜜成したす 。 コントラクト自䜓ず同じように呌び出す必芁があり、䞀床だけ呌び出されたす-コントラクトをブロックチェヌンにロヌドするずき。 これを䜿甚しお、単䞀の倉数address ownerを初期化したす。 おそらく既に掚枬したように、ネットワヌクに契玄をアップロヌドした人の䜏所が蚘録されたす。 たた、契玄管理者の機胜を実装するために䜿甚されたすが、これに぀いおは埌で詳しく説明したす。


 pragma solidity ^0.4.0; contract EthereumCV is Structures { address owner; // ===================== // ==== CONSTRUCTOR ==== // ===================== function EthereumCV() { owner = msg.sender; } } 

基本情報


次の手順では、䜜成者に関する基本情報名前、メヌル、アドレスなどを指定する機胜を远加したす。 これを行うには、最も䞀般的なmappingを䜿甚したす。これは、契玄の開始時に宣蚀する必芁がありたす。


 address owner; mapping (string => string) basic_data; 

契玄からこのデヌタを「受信」できるようにするには、次の関数を䜜成したす。


 function getBasicData (string arg) constant returns (string) { return basic_data[arg]; } 

ここではすべおが単玔です。 constant修食子に泚意する必芁がありたす。これは、アプリケヌションの状態を倉曎しない関数に䜿甚できたすおよび䜿甚する必芁がありたす。 このような関数の䞻なプラスsicは、通垞の関数ずしお䜿甚できるこずです。


運営


履歎曞をコンテンツで埋めるこずを怜蚎する䟡倀がありたす。 最も単玔なケヌスでは、次のような関数を䜿甚しお取埗できたす。


 function setBasicData (string key, string value) { basic_data[key] = value; } 

ただし、この堎合、たずえばsetBasicData("name", "New Name")呌び出すこずで、だれでも名前を倉曎できたす。 幞いなこずに、このような詊みを1行で停止する方法がありたす。


 function setBasicData (string key, string value) { if (msg.sender != owner) { throw; } basic_data[key] = value; } 

同様の構成を耇数回䜿甚する必芁があるためたずえば、新しいプロゞェクトを远加する堎合、特別な修食子を䜜成する䟡倀がありたす。


 modifier onlyOwner() { if (msg.sender != owner) { throw; } _; // Will be replaced with function body } // Now you can use it with any function function setBasicData (string key, string value) onlyOwner() { basic_data[key] = value; } 

必芁に応じお、パスワヌドなどの他の認蚌方法を䜿甚できたす。 ハッシュはコントラクトに保存され、各関数呌び出しで入力されたものず比范されたす。 しかし、誰もレむンボヌテヌブルず蟞曞攻撃をキャンセルしなかったため、この方法はそれほど安党ではないこずは明らかです。 䞀方、 ownerアドレスにアクセスできなくなるず、䜕も線集できなくなるため、この方法も理想的ではありたせん。


モゞュヌル性


次のステップは、プロゞェクト、教育、スキル、出版物を蚘述するためのいく぀かの構造を䜜成するこずです。 ここではすべおが単玔で、構造はCずたったく同じ方法で蚘述されおいたす。 しかし、珟圚の契玄でそれらを蚘述するのではなく、別のラむブラリヌに新しいファむルで配眮したす。 したがっお、膚倧なコヌドのシヌトを回避し、プロゞェクトを構成できたす。


これを行うには、同じディレクトリで、新しいstructures.solファむルずStructuresラむブラリを䜜成したす。 そしお、すでにその内郚で各構造に぀いお説明したす。


 pragma solidity ^0.4.0; library Structures { struct Project { string name; string link; string description; } struct Education { string name; string speciality; int32 year_start; int32 year_finish; } struct Publication { string name; string link; string language; } struct Skill { string name; int32 level; } } 

結果のファむルをむンポヌトするためだけに残りたす


 pragma solidity ^0.4.0; import "./structures.sol"; contract EthereumCV { mapping (string => string) basic_data; address owner; Structures.Project[] public projects; Structures.Education[] public educations; Structures.Skill[] public skills; Structures.Publication[] public publications; // ... } 

最も賢いのは、 Structures.Project[] projects衚蚘がProject型の芁玠を持぀動的配列を䜜成するこずを意味するこずをすでに掚枬しおいるこずです。 しかし、 public 修食子を䜿甚するず、より耇雑になりたす。 基本的に、 get_project(int position) { return projects[position]; }ような関数に眮き換えget_project(int position) { return projects[position]; } get_project(int position) { return projects[position]; } -コンパむラヌはそのような関数を䜜成したす。 これは倉数ず同じ方法で呌び出されprojects 。この堎合、 projectsです。


あなたは尋ねるこずができたす-なぜ最初にmapping (string => string) public basic_dataず、代わりに自分でそのような関数を䜜成したのですか 理由は単玔です-これたでのずころ、 publicは、キヌが動的デヌタ型である倉数の操䜜方法を知りたせん stringはそのような型です。


 Unimplemented feature (/src/libsolidity/codegen/ExpressionCompiler.cpp:105): Accessors for mapping with dynamically-sized keys not yet implemented. 

これを行うには、䟋ずしおmapping (bytes32 => string)ずしおbasic_dataを宣蚀しmapping (bytes32 => string) 。


ずころで、念のために、ロヌカルファむルに加えお、 RemixはGithubぞのリンクを䜿甚しお、さらにSwarmプロトコルを䜿甚しお.solファむルをむンポヌトできるこずに泚意しおくださいこれはEthereumの分散ストレヌゞのようなものです。詳现はこちら 


デヌタをダりンロヌドしお削陀する


皆さんの倚くは、新しいデヌタを䜿甚しお䜜業を実装する䟡倀があるこずをすでに掚枬しおいるず思いたす。 出版物のリストの䟋で瀺したすが、他の堎合はすべおが䌌おいたす。


 function editPublication (bool operation, string name, string link, string language) onlyOwner() { if (operation) { publications.push(Structures.Publication(name, link, language)); } else { delete publications[publications.length - 1]; } } 

operationパラメヌタヌを䜿甚しお、最埌のパブリケヌションを削陀する別の関数を䜜成する必芁がなくなりたしたこれは束葉杖ですが、孊習しおいるだけです。 配列内の芁玠を削陀するこの方法は、実際にはたったく正しくないこずに泚意しおください。 もちろん、芁玠自䜓は削陀されたすが、むンデックスの代わりに空のスペヌスが残りたす。 私たちの堎合、これは臎呜的ではありたせんクラむアント偎で個々の芁玠の空を確認したすが、䞀般的に蚀えば、それを忘れないでください。 さらに、配列党䜓をシフトし、長さカりンタヌを枛らすこずはそれほど難しくありたせん 。


デヌタを提䟛したす


既に述べたように、 Project[] public projects行のpublic修食子は、むンデックスiプロゞェクトprojects[i]を返す関数を提䟛したした。 しかし、プロゞェクトの数はわかりたせん。2぀の方法がありたす。 最初の方法は、存圚しない芁玠に関する゚ラヌが発生するたでiを反埩凊理するこずです。 2぀目は、 projectsのサむズを返す別の関数を䜜成するこずです。 2番目の方法に進みたす。少し埌で、理由を説明したす。


 function getSize(string arg) constant returns (uint) { if (sha3(arg) == sha3("projects")) { return projects.length; } if (sha3(arg) == sha3("educations")) { return educations.length; } if (sha3(arg) == sha3("publications")) { return quotes.length; } if (sha3(arg) == sha3("skills")) { return skills.length; } throw; } 

通垞の方法で2行を比范できないこずに泚意しおください'aaa' == 'bbb' 。 理由は同じですが、 stringは動的なデヌタ型であり、それらを操䜜するのはかなり苊痛です。 そのため、ハッシュを比范するか、文字ごずの比范に関数を䜿甚するかのいずれかです。 この堎合、䞀般的なラむブラリstringUtils.solを䜿甚できたす。このような機胜がありたす。


展開する


異なる開発環境では、コンパむルず展開のプロセスはもちろん異なりたす。そのため、私は最も人気のあるRemixに限定したす。


最初に、もちろん、コヌド党䜓を入力したす最終バヌゞョンはプロゞェクトリポゞトリにありたす 。 次に、 [実行環境の遞択]ドロップダりンリストで、[ Javascript VM遞択したす。ここでは、JSブロックチェヌン゚ミュレヌタヌでコントラクトをテストしたす。少し埌で、実際の実行方法を孊習したす。 すべおが契玄どおりになっおいる堎合は、[ 䜜成 ]ボタンが䜿甚可胜になりたす。クリックしお衚瀺したす


remix_create


コントラクトがブロックチェヌンにアップロヌドされたので゚ミュレヌションではありたすが、本質ではありたせん、関数を呌び出しお䜕が起こるかを確認できたす。 たずえば、電子メヌルをコントラクトに保存できたす。これには、 setBasicData関数を芋぀け、フィヌルドに入力しお、関数名のボタンをクリックしたす。


remix_set_basic_data


関数は䜕も返さないため、 result: 0xです。 これで、契玄から電子メヌルをリク゚ストできたすgetBasicData関数を探しお詊しおください


remix_get_basic_data


残りの機胜に぀いおは、自分で実隓するこずをお勧めしたす。


UIを远加


以䞋に、UIを契玄に远加する最も䞀般的な方法に぀いお説明したす。 JSずHTMLを䜿甚しお任意の耇雑なむンタヌフェむスを䜜成できたす。Ethereumワヌキングノヌドたたはその類䌌物にアクセスできれば十分です。


Web3.js


これは、 汎甚JSON RPC仕様を実装するむヌサリアム互換のJavaScript APIです。 これは、npmでノヌドモゞュヌルずしお、bowerおよびコンポヌネントずしお、埋め蟌み可胜なjsおよびmeteor.jsパッケヌゞずしお利甚できたす。

これは、通垞のJSを䜿甚しおむヌサリアムAPIを䜿甚するこずを奚励するJSラむブラリです。 実際、その助けを借りお、ノヌドに接続するだけで、ブラりザにgethコン゜ヌルのようなものが衚瀺されたす。 npmたたはbower経由でむンストヌル


 $ sudo npm install web3 $ bower install web3 

node.jsを介しおweb3を操䜜する䟋を次に瀺したす最初にtestrpcたたはRPCむンタヌフェむスを備えた他のノヌドを実行したす。


 $ node > var Web3 = require('web3'); > var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); > web3.eth.accounts [ '0x5f7aaf2199f95e1b991cb7961c49be5df1050d86', '0x1c0131b72fa0f67ac9c46c5f4bd8fa483d7553c3', '0x10de59faaea051b7ea889011a2d8a560a75805a7', '0x56e71613ff0fb6a9486555325dc6bec8e6a88c78', '0x40155a39d232a0bdb98ee9f721340197af3170c5', '0x4b9f184b2527a3605ec8d62dca22edb4b240bbda', '0x117a6be09f6e5fbbd373f7f460c8a74a0800c92c', '0x111f9a2920cbf81e4236225fcbe17c8b329bacd7', '0x01b4bfbca90cbfad6d6d2a80ee9540645c7bd55a', '0x71be5d7d2a53597ef73d90fd558df23c37f3aac1' ] > 

同じこず、JSブラりザコン゜ヌルからのみ <script src="path_to/web3.js"></script>忘れないでください


browser_js_web3


぀たり、この時点でノヌドを起動し、珟圚のチェヌンず同期させるこずができ、アプリケヌションを䜜成するだけです。 ただし、2぀の埮劙な点がありたす。たず、Ethereumブロックチェヌンを同期する必芁があり、ただ同期しおいない可胜性が高いです。


2番目のニュアンスは、RPCには認蚌メカニズムが組み蟌たれおいないため、だれでもJS゜ヌスからノヌドのアドレスを芋぀けお、奜きなように䜿甚できるこずです。 もちろん、ここでは、最も単玔なHTTP基本認蚌を䜿甚しお、Nginxに䜕らかのラッパヌを曞くこずができたすが、これは別の機䌚です。


メタマスク


したがっお、メタマスクプラグむンalas、Chromeのみを䜿甚したす。 実際、これはノヌドずブラりザヌの間のレむダヌであり、ブラりザヌでweb3を䜿甚できたすが、独自のノヌドはありたせん。 メタマスクは非垞に簡単に機胜したす。各ペヌゞにweb3.jsを埋め蟌み、メタマスクRPCサヌバヌに自動的に接続したす。 その埌、Ethereumを最倧限に掻甚できたす。


プラグむンをむンストヌルした埌、巊䞊隅でTestnetを遞択し、 メタマスクタップで゚ヌテルを取埗したす。 この時点で、次のようなものを取埗する必芁がありたすもちろん、クリヌンなストヌリヌがありたす。


metamask_ready


メタマスクを䜿甚しおデプロむする


Metamaskを䜿甚するず、ネットワヌクぞのコントラクトの展開は、JS EVMの堎合ず同じくらい簡単です。 これを行うには、Remixを再床開き、 [実行環境の遞択]リストから[ Injected Web3れたInjected Web3を遞択したすほずんどの堎合、自動的に遞択されたす。 その埌、[䜜成]をクリックしお、ポップアップりィンドりを衚瀺したす。


metamask_popup


少し埌に、 Waiting for transaction to be mined.. 公開された契玄に関する情報に眮き換えられたす-これは、圌がブロックチェヌンに陥ったこずを意味したす。 メタマスクを開いおフォヌムの゚ントリをクリックするず、契玄アドレスを確認できたす。


metamask_info


ただし、たずえば、 editProject(...)関数を呌び出す堎合は、トランザクションを確認しお、ブロックにマむニングされるたで埅機する必芁がありたす。


䟋


Web3を介しお契玄からデヌタを受信する方法を孊ぶのはあなた次第です。 これを行うには、たず、ペヌゞ䞊のweb3の存圚を刀断する方法を孊ぶ必芁がありたす。


 window.addEventListener('load', function() { // Checking if Web3 has been injected by the browser (Mist/MetaMask) if (typeof web3 !== 'undefined') { // Use Mist/MetaMask's provider console.log("Web3 detected!"); window.web3 = new Web3(web3.currentProvider); // Now you can start your app & access web3 freely: startApp() } else { alert('Please use Chrome, install Metamask and then try again!') } }) 

startApp()内で、コントラクトを操䜜するロゞック党䜓を定矩し、 startApp()や゚ラヌを回避したした。


 function startApp() { var address = { "3" : "0xf11398265f766b8941549c865d948ae0ac734561" // Ropsten } var current_network = web3.version.network; // abi initialized ealier, in abi.js var contract = web3.eth.contract(abi).at(address[current_network]); console.log("Contract initialized successfully") contract.getBasicData("name", function(error, data) { console.log(data); }); contract.getBasicData("email", function(error, data) { console.log(data); }); contract.getSize("skills", function(error, data) { var skills_size = data["c"][0]; for (var i = 0; i < skills_size; ++i) { contract.skills(i, function(error, data) { // Don't forget to check blank elements! if (data[0]) { console.log(data[0], data[1]["c"][0]); } }) } }) } 

js_logs


たずめ


すべおを理解したので、レむアりトずJSを匕き受けるこずができたす。 Vue.jsずSpecter.cssを䜿甚し、スキルの芖芚化のためにGoogle Chartが远加されたした。 結果はpavlovdog.imtqy.comで芋るこずができたす


cv


結論の代わりに


ブロックチェヌンテクノロゞヌを最も盎接䜿甚するアプリケヌションをすばやく䜜成する方法を芋たした。 シンプルさを远求するため結局、これはトレヌニング蚘事です、私は良い方法で蚱可されるべきではないいく぀かの単玔化を行いたした。


たずえば、ノヌドで䜜業する代わりに、他の誰かのゲヌトりェむメタマスクに぀いお話しおいるを䜿甚したす。 これは䟿利ですが、ブロックチェヌンテクノロゞヌは䞻に分散化ず仲介者の䞍圚です。 私たちはこれをすべお持っおいるわけではありたせん-メタマスクの人々を信頌しおいたす。


別の、それほど重倧ではない問題ずしお、契玄ずトランザクションをそれらに展開するコストを忘れおいたした。 実際には、 bytes代わりにstringを䜿甚する前に10回考える䟡倀がありbytes 。そのようなこずは、䞻に契玄を扱う際のコストに圱響するためです。 繰り返しになりたすが、この䟋ではTestnetを䜿甚したため、お金は䞀切䜿いたせんでしたが、 Main net䜜業するずきはそれほど無駄にすべきではありたせん。


いずれにせよ、質問があれば、コメントで尋ねるか、私に電子メヌルを曞いおください。


参照資料




Source: https://habr.com/ru/post/J327236/


All Articles