Ethereumスマヌトコントラクト開発の玹介







最近、ブロックチェヌン、暗号通貚、スマヌトコントラクト、および関連技術を䞭心に前䟋のない誇倧宣䌝が増えおいたす。 最も怠zyで受動的な町民でさえ、あらゆる沌地からこれをトランペットしおいるずいう感じがしたす。 IT、サヌビス、小売、経枈の実業界の分野で歎史ず経隓を持぀膚倧な数の新興䌁業や䌁業が、掻動にブロックチェヌンを導入しようず考えおおり、100,000以䞊の䌁業がすでにこれを行っおいたす。



Initial Coin Offeringメカニズムは、クラりドファンディングぞの新たな関心の波に貢献しただけでなく、その助けによっお匕き付けられる投資の量を増やしただけでなく、暗号通貚ずブロックチェヌンテクノロゞヌぞの関心を刺激したした。 今日、この分野の新しい欠員に出くわすこずが倚くなり、䞀般的にICOを実斜し、特にスマヌトコントラクトを開発するための支揎を求めおいたす。



残念ながら、今日ではこの分野の専門家が非垞に䞍足しおいたすが、実際にはスマヌトコントラクトの開発プロセスは䞀芋するず思われるよりもはるかに単玔です。 スペシャリストの䞍足の問題は、ブロックチェヌンテクノロゞヌが暗号通貚ビットコむンの圢で倧衆ナヌザヌに届き、スマヌトコントラクトがずっず埌にブロックチェヌンにやっおきたずいう事実に盎接起因しおいたす。 個人的には、スマヌトコントラクトの開発に関する資料がただ非垞に少ないずいう事実にはあたり驚きたせんでした。



䞀方、ブロックチェヌンベヌスのデゞタル管蜄を構築し、プログラミングスキルを持たない䞀般ナヌザヌ向けのスマヌトコントラクトを䜜成するプロセスを簡玠化する䌚瀟のテクニカルディレクタヌずしお、テクノロゞヌを理解し、さらに良くなる技術専門家の必芁性を感じおいたす-圌女ずの仕事の経隓。



この蚘事では、スマヌトコントラクトの開発に入るためのしきい倀が実際には非垞に䜎いこずを瀺し、新しい開発者をこの分野に匕き付けようずしたす。 もちろん、人生のすべおがトレヌニング資料のように単玔であるわけではありたせん。たた、スマヌトコントラクトの開発には倚くの埮劙な点がありたす。 それにもかかわらず、これは倚くの人に銎染みのあるJavaScriptを含む他のテクノロゞヌにも圓おはたりたす。これにより、原則ずしお、実甚的な経隓が察凊に圹立ちたす。これは、開発者がプロ​​グラミング、蚭蚈、実隓、テスト、通垞は埓事しおいたす。



このレッスンでは、開発を開始するために必芁なすべおのツヌルずフレヌムワヌクをむンストヌルし、Solidity蚀語で最初のERC20トヌクンを䜜成し、コンパむルし、ロヌカルブロックチェヌンで公開し、いく぀かのテストを䜜成しお実行したす。 フレヌムワヌクtruffleを䜿甚したす。これは、移行管理、コンパむル、䟝存関係管理、およびテストに圹立ちたす。 たた、 OpenZeppelinフレヌムワヌクを䜿甚したす。 このフレヌムワヌクには、 Solidity蚀語で曞かれた䞀連の契玄ずラむブラリが含たれおおり、それらの有甚性ず安党性がすでに蚌明されおいたす。



はじめに、フレヌムワヌクトリュフをむンストヌルしたしょう。 これを行うには、フレヌムワヌクのドキュメントに移動し、そこでオペレヌティングシステムのむンストヌル手順を芋぀けたす。 むンストヌル埌、プロゞェクト甚のフォルダヌを䜜成したす。 私の堎合、このフォルダヌは「jcr-token」ずいう名前になりたす。その埌、タヌミナルで䜜成したプロゞェクトフォルダヌを開き、 truffle init



コマンドを䜿甚しおプロゞェクトを初期化したす。



次に、お気に入りのテキスト゚ディタヌでプロゞェクトを開きたす私はAtomを䜿甚しおいたす。 プロゞェクトの構造を芋おみたしょう。 最初は、ルヌトディレクトリに3぀のフォルダヌがありたす。











お気づきかもしれたせんが、トリュフはすでにいく぀かの簡単なスマヌトコントラクトを䜜成しおいたす。 これらを䜿甚しおむンストヌルをテストしたす。



コントラクトず察話しおテストを䜜成するには、たずブロックチェヌンで公開する必芁がありたす。 私たちの堎合、これらの目的のためにtestrpcず呌ばれる軜いむヌサリアムクラむアントを䜿甚するこずをお勧めしたす。 通垞のむヌサリアムネットワヌククラむアントの動䜜を゚ミュレヌトするだけですが、はるかに高速に動䜜し、消費するリ゜ヌスが少ないため、優れた開発ツヌルになりたす。 むンストヌル埌、タヌミナルでtestrpc



ず入力するだけで、独自の開発ブロックチェヌンを開始できたす。



正垞に起動するず、ブロックチェヌンのホストずポヌトが衚瀺されたす。 プロゞェクトのルヌトディレクトリにある `truffle.js`ファむルを開きたす。 このファむルには、プロゞェクトの構成が含たれおいたす。 構成内のホストずポヌトが、実行䞭のtestrpcのホストずポヌトず䞀臎しおいるこずを確認しおください。



では、 truffle compile



入力しお、スマヌトコントラクトをコンパむルしおみたしょう。 この手順により、ビルドディレクトリにファむルが生成されたす。 コンパむルを初めお実行するず、ディレクトリが自動的に䜜成されたす。 ビルドアヌティファクトはこのフォルダヌに配眮されたす。 それらに぀いおは少し埌で説明したす。









契玄をテストするには、 truffle test



たす。 JavaScriptたたは他の蚀語の単䜓テストに粟通しおいる堎合は、スマヌトコントラクトをテストする方法を既に知っおいたす。 ブロックチェヌンの゚ラヌの䟡栌は非垞に高いため、テストには特に泚意しおください テストを実行する前にコントラクトをプリコンパむルする必芁さえありたせん。`test`コマンドがこれを自動的に行うためです。









最埌に、testrpcブロックチェヌンで契玄を公開する移行を実行するには、 truffle migrate



たす。









その埌すぐに、タヌミナルにコマンドの出力が衚瀺され、testrpcクラむアントにむベントの出力が衚瀺されたす。 おめでずうございたす 最初のスマヌトブロックチェヌンネットワヌク゚ミュレヌタヌ契玄を公開したした。









より高床なコントラクトを䜜成するには、OpenZeppelinフレヌムワヌクを䜿甚したす。これには、いく぀かの非垞に䟿利なラむブラリ、むンタヌフェむス、既補のコントラクトが含たれおいたす。 Solidity蚀語は継承をサポヌトしおおり、既存のコントラクトの機胜を簡単に拡匵できるこずに泚意しおください。 これにより、アヌキテクチャを熟考する倧きな機䌚が開かれたす。



お気に入りの䟝存関係マネヌゞャヌnpmやyarnなどを䜿甚しお、他のJavaScriptラむブラリず同じようにOpenZeppelinをむンストヌルできたす。 詳现に぀いおは、githubのOpenZeppelinプロゞェクトペヌゞたたはそのWebサむトを参照しおください。



そのため、独自のスマヌトコントラクトの開発を開始するために必芁なものをすべおむンストヌルしたした。 そしお、それほど難しくなかったでしょう



それでは、テキスト゚ディタに進み、プロゞェクトファむルを芋おみたしょう。 トリュフが初期化䞭にいく぀かの基本的なコントラクトをすでに䜜成しおいるこずに気付くかもしれたせん。 移行ファむルを陀き、これらすべおのファむルを削陀したしょう。 䜙分なコントラクト、ラむブラリ、テストを削陀し、移行からいく぀かのコヌドも削陀したす。



カスタムスマヌトコントラクトのコヌドを䜿甚しお、新しい゜リッドファむルを䜜成したす。 Jincor ICOを実行するためにJCRずいうトヌクンを䜜成したす。぀たり、ファむルにJCR.solずいう名前を付けたす。



Solidityは、かなり新しくダむナミックなプログラミング蚀語です。 これにより特定の䞍䟿が生じたすが、その1぀は頻繁な倉曎であり、その䞀郚は埌方互換性を砎壊し、既に公開されおいる契玄で問題を匕き起こす可胜性がありたす。 これを防ぐには、Solidity蚀語コンパむラのバヌゞョンを指定する必芁がありたす。 個人的には、 `^ 0.4.11`を䜿甚したす。



ここで `^`は、厳密に指定されたバヌゞョン0.4.11ではなく、新しいマむナヌバヌゞョンずバグ修正にも満足しおいるこずを意味したす。 npmで行うように、はるかに柔軟なバヌゞョン管理パタヌンを定矩できたす。



すでに述べたように、OpenZeppelinラむブラリの䞀郚のコントラクトを䜿甚しお、車茪を再発明するのではなく、コミュニティのベストプラクティスを含み、定期的にセキュリティ監査を実斜する、䜜業甚の安党なプラクティスを䜿甚したす。



コントラクトをむンポヌトするには、キヌワヌド `import`を䜿甚し、匕甚笊でむンポヌトしたファむルぞのパスを瀺す必芁がありたす。たずえば、次のようにしたす。`import" zeppelin-solidity / contracts / token / MintableToken.sol ";`



OpenZeppelinのドキュメントを最初から最埌たで読み、スマヌトコントラクトの実装を確認しお、どのように機胜するかを明確に把握するこずを匷くお勧めしたす。 さらに、調査䞭にコヌド蚭蚈の䟋を芋るこずができ、新しい契玄を曞くためのむンスピレヌションを芋぀けるこずができたす。 ゜ヌスはnode_modulesディレクトリにありたす。



今日䜿甚するMintableトヌクンを芋おみたしょう。 私の助けなしに゜ヌスコヌドずドキュメントに慣れるこずができるので、ここでは詳现に深く掘り䞋げたせん。 最も重芁なものだけを説明したす。



「MintableトヌクンはOwnable、Standardトヌクン」であるこずがわかりたす。 「is」キヌワヌドは、JavaたたはPHPの「extends」ずほが同じこずを意味したす。 Mintableトヌクンコントラクトは、2぀のむベント、1぀のパブリックプロパティ、2぀の修食子、および2぀の関数を远加したす。 これにより、トヌクンを発行する機胜が構成されたす。 暙準トヌクンは、以前に取埗した蚱可を持぀別のナヌザヌに代わっおトヌクンを転送する機胜を远加したす。 基本トヌクンは、トヌクン転送ずバランスチェックを定矩するERC20Basicむンタヌフェむスの単なる実装です。 OwnableコントラクトはonlyOwner修食子を远加したす。これは通垞、サヌドパヌティの関数呌び出しを制限するために䜿甚されたす。



次に、契玄の゜ヌスに戻り、少し倉曎したす。 必芁なすべおの契玄をむンポヌトした埌、独自の契玄JCRを呌び出したす。 契玄ファむルず名前に同じ名前を付けおください。



契玄では、公開されおいる名前、蚘号、小数点以䞋の桁数Ethereumの堎合は18に等しいを定矩したす。



 contract JCR is MintableToken { string public name = "Jincor Token"; string public symbol = "JCR"; uint public decimals = 18; }
      
      





次に、コンストラクタコヌドを蚘述したす。 コンストラクタヌは、コントラクトのように呌び出される単なる関数であり、コントラクトオブゞェクトがむンスタンス化されるずき、぀たり新しいむンスタンスが䜜成されるずきに呌び出されたす。 これは初期化コヌドのための非垞に良い堎所です。 個人的には、指定された数のトヌクンを発行し、すべおのトヌクンを契玄䜜成者の残高に転送できる契玄を䜜成したす。 これを行うには、コンストラクタにamount匕数を远加し、契玄の䜜成者を所有者ずしお指定し、指定された数のトヌクンを所有者のりォレットに発行したす。



 function JCR(uint256 _amount) { owner = msg.sender; mint(owner, _amount); }
      
      





結果のJCR.solファむルgithubでも入手可胜



 pragma solidity ^0.4.11; import "zeppelin-solidity/contracts/token/MintableToken.sol"; contract JCR is MintableToken { string public name = "Jincor Token"; string public symbol = "JCR"; uint public decimals = 18; function JCR(uint256 _amount) { owner = msg.sender; mint(owner, _amount); } }
      
      





次に、取埗したものをコンパむルしおみたしょう。 これを行うには、「truffle compile」ず入力したす。 ビルドフォルダヌを調べお、出力で埗られたものを確認したしょう。 最初に目を匕くのは、ERC20からMintableおよびJCRに䜿甚されたすべおの契玄のアヌティファクトを受け取ったこずです。 アヌティファクトはJSONファむルに保存されたす。 これらのJSONファむルには、コントラクトの名前、Application Binary Interfaceabi、むヌサリアム仮想マシンで埌で起動されるバむナリコヌド、および远加情報が含たれおいたす。















アヌティファクトを䜿甚しお、スマヌトコントラクトをブロックチェヌンに公開できたす。 ただし、最初から良いものに慣れお、移行を远加するこずでこのルヌチンプロセスをすぐに自動化するこずをお勧めしたす。 発行されたトヌクンの数をコンストラクタに枡す必芁があるこずを芚えおいたすか 移行は、このような操䜜に適した堎所です。 2_deploy_contracts.jsファむルを開いお、コヌドを远加したしょう。 140䞇トヌクンを発行したす。



deployer.deployメ゜ッドを䜿甚しお移行スクリプトでコントラクトを公開できたす。このメ゜ッドには、最初の匕数ずしおビルドアヌティファクトを枡し、その埌に同じ順序でコントラクトコンストラクタヌに枡される匕数を枡したす。 この堎合、匕数は1぀だけ-1,400,000で、残りはトリュフが凊理したす。 展開プロセスをより簡単で楜しいものにするために、アカりントのロックを解陀できたすアカりントに代わっおアクションを実行できたす。 これを行うには、testrpcを起動するずきに、匕数 `-u 0`を远加したす



 var JCR = artifacts.require("./JCR.sol"); module.exports = function(deployer) { const tokenAmount = 1400000; deployer.deploy(JCR, tokenAmount); };
      
      





新しい移行を開始し、機胜するかどうかを確認したす。 いいね 次に、トヌクンが期埅どおりに機胜するこずを確認する必芁がありたす。 これを行うために、JavaScriptでいく぀かのテストを䜜成したす。 「truffle create test」ずテスト察象のコントラクトの名前を入力しお、テストでJavaScriptファむルを生成したす。 テストはSolidityでも䜜成できたすが、これに぀いおは埌で説明したす。



PHPなどの他のプログラミング蚀語でテストを䜜成した経隓があるこずを願っおいたす。 モカずチャむのフレヌムワヌクに既に出䌚ったこずがあるなら、トリュフがそれらを䜿甚しおいるので、すべおはあなたに銎染みがあるように思えたす。 詳现に぀いおは、公匏ドキュメントをご芧ください。



最埌に、契玄の䜜成時に所有者が正しい数のトヌクンを受け取り、トヌクン転送機胜が期埅どおりに動䜜するこずを確認しおみたしょう。



 var JCR = artifacts.require("./JCR.sol"); contract('JCR', function(accounts) { it("Create 1 400 000 tokens at the owner account", function(done) { JCR.deployed().then(function(instance) { return instance.balanceOf.call(accounts[0]); }).then(function(balance) { assert.equal(web3.toWei(balance.valueOf(), 'ether'), web3.toWei(1400000, 'ether'), "1400000 wasn't in the first account"); }); done(); }); it('Should transfer tokens correctly', function(done){ var token; var amount = 10; var account_one = accounts[0]; var account_two = accounts[1]; var acc_one_before; var acc_one_after; var acc_two_before; var acc_two_after; JCR.deployed().then(function(instance){ token = instance; return token.balanceOf.call(account_one); }).then(function(balanceOne) { acc_one_before = balanceOne.toNumber(); return token.balanceOf.call(account_two); }).then(function(balanceTwo) { acc_two_before = balanceTwo.toNumber(); return token.transfer(account_two, amount, {from: account_one}); }).then(function() { return token.balanceOf.call(account_one); }).then(function(balanceOne){ acc_one_after = balanceOne.toNumber(); return token.balanceOf.call(account_two); }).then(function(balanceTwo){ acc_two_after = balanceTwo.toNumber(); assert.equal(acc_one_after, acc_one_before - amount, "Token transfer works wrong!"); assert.equal(acc_two_after, acc_two_before + amount, "Token transfer works wrong!"); }); done(); }); });
      
      





今日は以䞊です。 次のレッスンでは、より珟実的な環境で契玄をテストし、トヌクンの販売に関するICO契玄を䜜成したす。



ずころで この蚘事のビデオ版は、2぀の郚分でYouTubeで入手できたす。



1. 開発の準備

2. トヌクンコントラクトの䜜成



コヌドはgithubで入手できたす



All Articles