كيف تكتب عقدًا ذكيًا لـ ICO في 5 دقائق



مرحبا بالجميع! في هذه المقالة ، سأخبرك بكيفية إطلاق عقد جمع أموال ذكي لـ ICO الخاص بك على Ethereum في 5 دقائق وعدة أوامر في المحطة. من المحتمل أن يوفر لك هذا المقال عشرات الآلاف من الدولارات الأمريكية ، لأن أي مبرمج - وليس مبرمجًا أيضًا - سيكون قادرًا على إطلاق عقد ذكي مدقق وآمن (بدلاً من دفع 15000 - 75000 دولار للتطوير). باختصار ، يمكنك إرسال الأموال إلى هذا العقد الذكي وتلقي رموز ERC20 مقابله. يمكن القول أن هذه المقالة عبارة عن مجموعة من كل الخبرة التي اكتسبتها من خلال إطلاق ICO لمشروعي.

على الإنترنت ، هذه الخاصة بك مليئة بالفعل بمقالات حول العقود الذكية ، ولكن بمجرد أن تبدأ في كتابة واحدة ، تصادف حقيقة أن المعلومات تتكرر في كل مكان ، ولا توجد ببساطة دروس تعليمية حول كيفية خداع ERC20 ، أو أنها قديمة بالفعل. بالمناسبة ، لكي تظل هذه المقالة ذات صلة ، سأحاول الإشارة إلى الأماكن المحتملة التي قد تصبح فيها قديمة (وكيفية إصلاحها). دعنا نذهب!

الصلابة


هذا هو اسم اللغة الرئيسية التي طورها فريق الكفير لإطلاق العقود الذكية. إذا كنت مبرمجًا ، فما عليك سوى مراجعة وثائق اللغة - فهي بسيطة للغاية. بالمناسبة ، لقد جعلوا الأمر بسيطًا بحيث كان من الصعب ارتكاب خطأ في كتابة عقد ذكي. لذا فإن أي مبرمج ، على الأقل على مستوى المبتدئين ، سيكون قادرًا على معرفة ذلك. ليس هناك أي معنى على الإطلاق في دفع مبالغ ضخمة من المال للمطورين الذين يعرفون الصلابة - سيكون الأمر أرخص من حيث الحجم لتدريب مطور حالي.

العقود الذكية


... وكل ما تريد معرفته عنهم. تخطي هذا القسم إذا لم تكن مبرمجًا. العقد الذكي هو جزء من الكود. من حيث المبدأ ، هذه فئة من الصلابة (OOP ، نعم) ، ولها نوعان من الوظائف: تغيير الحالة وعدم تغيير الحالة. حسنًا ، من أجل تشغيل الوظائف في عقد ذكي فقط عن طريق إرسال الكفير إليه ، تحتاج إلى تحديد هذه الوظيفة payable .

الدولة هي مستودع البيانات ، blockchain ، EPT. يمكن للعقود تغيير blockchain (الدولة ، التخزين) - ولكن لتغيير blockchain تحتاج إلى دفع الكفير لعمال المناجم. لن يتم تحليل كيفية مشاركة الكفير في إطار هذه المقالة. يسمى الدفع لعمال المناجم لتشغيل كود تغيير الدولة الغاز. إذا قام شخص من الخارج بإلقاء الكفير على عنوان عقد ذكي مع استدعاء وظيفة معلمة payable ولكن لم يتم وضع علامة Constant عليها ، أو View أو Pure ، فسيتم خصم المبلغ المطلوب من الكفير للدفع إلى عمال المناجم من المبلغ المرسل. عادةً ، في الرموز المميزة لـ ERC20 ، هذه هي الوظائف التي تمنح إما مرسل الرمز المميز للكفير أو تنقل الرموز المميزة من حامل رمز مميز إلى آخر.

وإذا وضعت علامة على دالة في العقد تحتوي على الكلمات Constant أو View (فهي تعني نفس الشيء ، فهي تسمح لك فقط بقراءة الحالة) أو Pure (نفس الشيء ، حتى أنك لا تقرأ الحالة) ، فلن تحتاج حتى إلى إنفاق الكفير على تنفيذ هذه الوظيفة! سأقول أكثر من ذلك أن هذه الوظائف لا تحتاج إلى استدعائها من خلال المعاملات - بعد كل شيء ، يمكن لأي عميل زبادي أن ينفذها نظريًا في المنزل - ولا يحتاج أحد إلى معرفة ذلك بعد الآن (بعد كل شيء ، لم تتم كتابة أي شيء إلى blockchain).

وهناك شيئان مهمان في الصلابة: تعدد الوراثة ومعدلات الوظائف. أنت بحاجة أيضًا إلى معرفتهم.

أولًا - يمكن توريث العقود فقط في وقت واحد من عدة فئات مثل TimedCrowdsale و CappedCrowdsale و MintedCrowdsale و Ownable - في حين يتم إطلاق وظائف Ownable أيضًا واحدة تلو الأخرى - لكنني سأشرح ذلك لاحقًا كمثال.

والثاني هو القدرة على إنشاء وظائف سيتم إدراجها بعد ذلك في وظائف أخرى. إنه مثل التغليف البسيط ، فقط أكثر مرونة قليلاً - إنه حرفياً قالب وظيفي. عندما تقوم بإنشاء معدِّل ، تكتب الحرف الخاص _ حيث تقصد رمز الوظيفة باستخدام هذا المعدل. أي أن المعدلات ليست مجرد وظيفة مغلفة تُرجع قيمة ؛ هذا هو قالب دالة عندما يتم إدراج رمز من المعدّل حرفياً في وظيفة باستخدام هذا المعدل.

دعنا ننتقل إلى الممارسة.

بيئة الطبخ


إذا كنت لا تعرف ما هو الطرفية ، اقرأ هذه المقالة هنا . إذا كنت تستخدم النوافذ ، فقم بتعيين محطة طرفية عبر WLS. إذا كنت معتادًا بالفعل على Terminal ، فلنستمر. أيضا ، ضع نفسك Node.js على الفور - سيكون من الضروري للخطوات التالية. من الأفضل تثبيت LTS ، ولكن في الواقع ، لا فرق في أي من الإصدارات الحديثة للعقدة يجب تثبيتها.

أول شيء نقوم بتثبيته على الفور وبدء عملية مزامنة الكتلة هو geth . باختصار ، هذه أداة مساعدة مكتوبة في Go تسمح لنا بتشغيل عقدة الأثير على الكمبيوتر المحلي والاتصال بالشبكات الاختبارية والحقيقية. يمكنك التثبيت عبر أدوات التثبيت ، ولكنني أوصي بشدة بالحصول عليه مباشرة في Terminal ، كما هو موضح هنا . يمكنك التحقق مما إذا تم geth معايير geth الخاصة بك عن geth تشغيل الأمر في Terminal:

 geth version 

إذا قمت بصق نسخة geth - كل شيء في مخرمة ، فتابع البرنامج التعليمي. إن لم يكن - سيئًا ، صحيحًا ؛ يبدو أنك ستضطر إلى ممارسة الحب مع Terminal ونظام التشغيل الخاص بك - ولكن هذه ليست المرة الأولى التي تكتشف فيها ذلك. كيفية تثبيت geth ، قم بتشغيل الأمر في Terminal:

 geth --testnet console 

سيبدأ هذا عملية مزامنة العقدة الخاصة بك مع خادم الاختبار ، والتي يمكن عرض كتلها هنا . يمكنك التحقق مما إذا كنت قد قمت بالمزامنة مع الشبكة في وحدة التحكم geth عن طريق geth :

 eth.blockNumber #  0 —     eth.syncing #     false,     

استغرقت عملية المزامنة من ساعة إلى 4 ساعات - متى كيف. بالإضافة إلى حظر المزامنة ، سيتعين عليك أيضًا انتظار مزامنة الحالة - غالبًا ما تكون أطول من مزامنة المزامنة. يمكنك أيضًا استخدام geth --light مع علامة - --light - ثم تستمر المزامنة من بضع ثوان إلى دقيقة ولا يزال بإمكانك نشر العقود.

حسنًا ، لقد قمنا بتثبيت الأداة المساعدة الأولى - ضع الأداة التالية. نحن بحاجة إلى وضع testrpc ، فقط محاكاة testrpc محلية جدًا - testrpc . نعم ، لدينا 3 بلوكشين :

  • testrpc - محاكاة testrpc المحلية ؛ سريع ، لكن مزيف ومخزن فقط على جهازك
  • geth --testnet هو بالفعل بلوكشين حقيقي ، لكنك لن تخسر المال حيث يمكنك الحصول على الكفير واختبار جميع geth --testnet مجانًا
  • geth - mainnet ، main ، blockchain الحقيقي ، الكفير الحقيقي ؛ كل شيء بطريقة الكبار ، والأخطاء هنا هي خسائر الكفير الحقيقي

وفقًا لذلك ، سنبدأ عقد الاختبار مع testrpc ، ثم testrpc ، ثم geth --testnet مباشرة في geth .

testrpc عن طريق تشغيل الأمر التالي:

 npm install -g ethereumjs-testrpc 

حسنًا ، أو ترتفع فورًا مع الكمأة ، حيث أن testrpc الآن تحت جناح الكمأة ويسمى ganache-cli . على الرغم من أن الشيطان يعرف ، كل شيء testrpc مع testrpc الفانيليا. وإذا نجحت ، فلا تلمسها كما علمت في أكاديمية المجرات. يمكنك أيضًا تشغيله للتحقق من التثبيت من خلال تسجيل truffle في وحدة التحكم ، ولكن تتم مزامنة blockchain بالفعل معنا - دعنا لا نزعجها.

حسنًا ، اكتشفت blockchains؟ هناك الآن العقد وحتى تتم مزامنة الاختبار؟ نضع أداة ملائمة للعمل مع العقود الذكية على الكفير - truffle ، بالأمر التالي:

 npm install -g truffle truffle version #  ,  ,   

Truffle هي أداة تسمح لك بالاحتفاظ بالعقود الذكية في ملفات مختلفة ، واستيراد ملفات أخرى ، وكذلك تجميع رمز العقد الذكي الخاص بك في رمز بايت كبير واحد (غير قابل للقراءة من قبل شخص) ، يجدك تلقائيًا الحصول على geth قيد التشغيل محليًا (اختبار وحقيقي ) أو testrpc ، testrpc الذكي على هذه الشبكة. أيضًا ، تحقق من رمز العقد الذكي الخاص بك بحثًا عن الأخطاء والمعاملات المكتملة مؤخرًا تساعد أيضًا في تصحيح الأخطاء . إعلان التسمية الرئيسية باختصار.

في هذه المرحلة ، يجب أن تكون قد قمت بتثبيت: testrpc ، testrpc ، testrpc - إذا كان أي من هذا مفقودًا أو لم يبصق الإصدار إلى وحدة التحكم عند الطلب ، testrpc بتصحيح هذا ؛ وإلا فلن تنجح.

أيضا ، قمت بإلقاء نص bash بسيط يقوم بتثبيت كل شيء لك. تسمى بهذا الشكل:

 source <(curl -s https://raw.githubusercontent.com/backmeupplz/eth-installer/master/install.sh) 

- لكنني لم أختبرها أبدًا بعد ، لذا لست متأكدًا من أدائها. ومع ذلك ، سأكون سعيدًا لسحب الطلبات.

عقد فيجاش


كل شيء تم اختراعه وكتابته من أجلك - هذا جيد. القليل من الرايات سيكون نفس الشيء - لكني سأحاول التقليل من ذلك لك. سنستخدم عقود ERC20 الجاهزة من OpenZeppelin - هذا هو الآن معيار الصناعة ، لقد اجتازوا التدقيق ، وفي الواقع يستخدمون جميعًا رموزهم . شكرا جزيلا لمساهمتك في المصدر المفتوح.

أدخل cd في مجلد آمن ثم اكتب:

 mkdir contract && cd contract 

سنعمل في هذا المجلد. أنشئ كعبًا هنا لعقدنا الذكي:

 truffle init 

تتعثر بوضوح. لدينا الآن مجلدان مهمان للغاية سنتسلق فيهما: contracts migrations . الأول هو رمز عقودنا ، والثاني هو رمز الكمأة لمعرفة ما يجب فعله عند نشر العقود إلى blockchain.

بعد ذلك ، نحتاج إلى أخذ رمز العقد الذكي الحالي من npm ، وفي الواقع ، بدء المشروع نفسه:

 npm init -y #     ( -y) npm install -E openzeppelin-solidity #       ( -E) 

حسنًا ، كود العقود الذكية من OpenZeppelin موجود في جيبنا في المجلد node_modules/openzeppelin-solidity/contracts . ننتقل الآن إلى مجلد contracts الرئيسية ، ونحذف جميع الملفات هناك ونضيف الملفات MyToken.sol و MyCrowdsale.sol - بطبيعة الحال ، ستقوم بتسمية MyCrowdsale.sol بشكل مختلف. الأول سيكون عقدًا لـ ERC20 Token الخاص بنا ، والثاني هو عقد ICO الخاص بنا ، والذي سيقبل الكفير ويوزع MyToken الأشخاص. قد تكون هذه المقالة قديمة ، ولكن يمكنك دائمًا الاطلاع على الكيفية التي تقترح OpenZeppelin إنشاء عقود في المستودعات الخاصة بها . هكذا MyToken.sol :

 pragma solidity ^0.4.23; // Imports import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; // Main token smart contract contract MyToken is MintableToken { string public constant name = "My Token"; string public constant symbol = "MTKN"; uint8 public constant decimals = 18; } 

جميل - لديك عقد ذكي من رمزك الخاص (فقط قم بتغيير الأسماء في الثوابت)! يمكنك معرفة MintableToken الميراث الموجود من MintableToken - ولكن كل شيء بسيط قدر الإمكان هناك. هذا رمز مميز يمكن إصداره (من الإنجليزية "Mint" - إلى mint) ، ويحق للمالك فقط إصداره ، حيث أن MintableToken موروث أيضًا من Ownable . أيضًا ، ترث MintableToken أيضًا من فئات رموز ERC20 التي كتبها OpenZeppelin ، والتي يتم فيها تنفيذ واجهة ERC20:

 contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } 

نعم ، هنا لديك واجهة ERC20 بالكامل. هل هو صعب؟ لا أعتقد ذلك. يمنحك الفرصة لإلقاء نظرة على عدد الرموز المميزة التي تم إصدارها ، والتحقق من رصيد العنوان وتحويل الرموز المميزة إلى عنوان آخر عن طريق عرض حدث نقل لعملاء الكفير الخفيف على الشبكة. وكل هذا تحصل عليه مجانًا في MyToken.sol بفضل عمل OpenZeppelin - إنها رائعة.

والآن دعنا ننتقل إلى الجزء الرئيسي من ICO - نحن بحاجة إلى قبول الكفير وإعطاء MyToken ! هذا ما MyCrowdsale.sol :

 pragma solidity ^0.4.23; // Imports import "../node_modules/openzeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/crowdsale/distribution/RefundableCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol"; import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; contract MyCrowdsale is CappedCrowdsale, RefundableCrowdsale, MintedCrowdsale { constructor( uint256 _openingTime, uint256 _closingTime, uint256 _rate, address _wallet, uint256 _cap, MintableToken _token, uint256 _goal ) public Crowdsale(_rate, _wallet, _token) CappedCrowdsale(_cap) TimedCrowdsale(_openingTime, _closingTime) RefundableCrowdsale(_goal) { //   ,  ,    // ,     require(_goal <= _cap); } } 

هكذا ، ماذا معنا؟ ماذا يا أولاد عقود ذكية؟ يرث بيعنا العام للرموز المميزة ثلاثة من أكثر الخصائص شيوعًا: فهي تحتوي على غطاء صلب لا يمكن جمعه بعد الآن ؛ غطاء ناعم ، لا يجمع الاسترات التي يتم إرجاعها ؛ بداية الوقت ونهاية بيع الرمز المميز. في الواقع ، ما هو المطلوب أيضا من أجل السعادة؟

المبرمجون ، لاحظوا كيف يتم ترتيب MyCrowdsale فئات الوراثة المتعددة في صف واحد والحصول على الحجج من المُنشئ الرئيسي لـ MyCrowdsale . أيضا ، نتحقق من أن القرص الصلب أعلى من المفتاح الوظيفي - Ales Gut! أيضًا ، لا MyCrowdsale المعلمات MyCrowdsale في مُنشئ MyCrowdsale - سنقوم MyCrowdsale في مرحلة نشر العقد في الكمأة.

هذا كل شيء - لديك عقود جاهزة من رمز ERC20 الخاص بك وحتى عقد ICO الذكي ، والذي تم تكوينه وفقًا لرغبتك ويمنحك رموزك الخاصة بالكفير. كما أنه مدعوم من جميع محافظ ERC20 - خطأ! دعنا ننتقل إلى الاختبارات اليدوية والنشر.

الهجرات


كما قلت سابقًا ، سنختبر بشكل تسلسلي على ثلاث شبكات blockchain ، لكن عملية الاختبار باستخدام الأقلام ستكون دائمًا هي نفسها. لنبدأ بـ testrpc ، ثم ننتقل إلى geth --testnet . المصابيح الأمامية سو ، لقد كتبنا للتو الرمز ، دعونا نحاول تجميعه. في مجلد المشروع ، اكتب:

 truffle compile 

إذا تم تجميع كل شيء دون مشاكل ، فسترى build ، الذي سيحتوي على krakozyab للكمأة بحيث يمكنه تضمين الرمز الثانوي لعقودك الذكية في blockchain. قبل نشر العقود الذكية ، نحتاج إلى إخبار الكمأة بما يجب القيام به على الإطلاق. يُطلق على نشر الكمأة للعقود الذكية الهجرة - حسنًا ، دعنا نتمسك بهذا المصطلح. انتقل إلى migrations/1_initial_migration.js وقم بتغييرها بالطريقة التالية:

 const token = artifacts.require("../contracts/MyToken.sol"); const crowdsale = artifacts.require("../contracts/MyCrowdsale.sol"); module.exports = function(deployer, network, accounts) { const openingTime = 1514764800; // 15  2018 const closingTime = 1561939200; // 1  2019 const rate = new web3.BigNumber(1); // 1   1  const wallet = '0x281055afc982d96fab65b3a49cac8b878184cb16'; // - const cap = 200 * 1000000; //  const goal = 100 * 1000000; //  return deployer .then(() => { return deployer.deploy(token); }) .then(() => { return deployer.deploy( crowdsale, openingTime, closingTime, rate, wallet, cap, token.address, goal ); }) .then(() => { // Crowdsale    var tokenContract = web3.eth.contract(token.abi).at(token.address); web3.eth.defaultAccount = web3.eth.accounts[0]; tokenContract.transferOwnership(crowdsale.address); }); }; 

هذا هو نفس الملف الذي ستستخدمه الكمأة لنشر العقود. إذن ماذا نفعل هنا؟ أولاً ، طلبنا تجميع MyToken و MyCrowdsale . بعد ذلك ، نقوم بتعيين الثوابت مع كل حجج ICO - تعيين أوقات البدء والانتهاء ؛ عدد الرموز التي سيحصل عليها الناس مقابل 1 كفير (0.000000000000000001 eth = 1 wei ؛ يشير تحديد decimals إلى عدد الطلبات التي نحتاجها للحصول على 1 من الرموز المميزة حديثًا) ؛ المحفظة ، حيث سيأتي الكفير الذي تم الحصول عليه من البيع ؛ غطاء صلب وغطاء ناعم. يرجى ملاحظة أن openingTime يجب أن يكون دائمًا بعد وقت الكتلة الحالية في blockchain - وإلا لن يتم حظر عقدك الذكي بسبب التحقق من الحالة في TimedCrowdsale . لقد خطوت في هذا أشعل النار ، ولا يمكن خصم المعاملات الفاشلة على الإطلاق. قم بتغيير هذه الثوابت كما يحلو لك.

الخطوة التالية هي بالتحديد نشر العقود الذكية. لا يوجد شيء مثير للاهتمام هنا: لدينا كائن deployer ينشر قطع أثرية ذكية للعقد ويمرر الحجج هناك. لاحظ أن MyToken يتم MyToken أولاً ، وبعد ذلك فقط MyCrowdsale - ويتم تمرير عنوان الأول في الثانية كوسيطة.

ثم الشيء الأكثر إثارة للاهتمام هو ما لا يكتبون عنه سواء في التوثيق أو في الكتب. عندما تقوم بإنشاء MyToken من محفظة ، تصبح هذه المحفظة هي مالك MyToken في فئة Ownable - يحدث نفس الشيء مع MyCrowdsale . إذا قمت بالتعمق في MintableToken ، يمكنك أن ترى أن Owner فقط هو من يمكنه سك النقود! ومن هو مالك MyToken ؟ هذا صحيح: العنوان الذي أزعجه. ومن سيرسل طلبات سك النقود؟ تصحيح: عقد MyCrowdsale الذكي. دعني أذكرك بأن العنوان الذي أنشأ MyToken و MyCrowdsale مختلفان.

لذلك ، فإننا نضيف خطوة النشر الثالثة غير الأرثوذكسية ، حيث يستدعي العنوان الذي تحدى العقود ( web3.eth.accounts[0] ) وظيفة transferOwnership في عقد MyToken يمتلك MyToken ويمكنه عمل سك النقود المعدنية. ولا يزال MyCrowdsale تحت ملكية web3.eth.accounts[0] - لذلك يتم تجميع كل شيء.

ملاحظة حول web3.eth.accounts[0] : عند نشر عقد ذكي ، تأكد من أن geth أو testrpc لديهم المحفظة الصحيحة في web3.eth.accounts[0] - لا تفقد المفتاح الخاص له ، على الرغم من أن هذا لا يضر بك ، ولكن فجأة سيحتاج المالك للقيام بشيء في وقت لاحق ، ولكن المفتاح لم يعد هناك؟
في testrpc ، كقاعدة ، يتم إنشاء الحسابات على الفور عند بدء التشغيل ويتم فتحها على الفور ؛ ومع ذلك ، في اختبار و blockchain حقيقي للهواء ، يجدر إنشاء حساب من خلال personal.newAccount() - ثم استكمل هذا العنوان عبر Faucet على اختبار blockchain أو الكفير الحقيقي في blockchain الحقيقي. لا تفقد كلمة المرور والمفاتيح الخاصة.
يمكنك أيضًا إضافة محفظة موجودة إلى حساباتك عن طريق الاتصال بـ web3.personal.importRawKey('pvt_key', 'password') ، ولكن لهذا تحتاج إلى استدعاء --rpcapi="db,eth,net,web3,personal,web3" المعلمة الإضافية --rpcapi="db,eth,net,web3,personal,web3" . أعتقد أنك ستكتشف ذلك.

الاختبار والنشر


نعم ، العقود جاهزة ، والترحيل مكتوب ، ويبقى فقط للنشر والتحقق. تتم إدارة كل من geth (اختبار وحقيقي) و testrpc بنفس الطريقة من خلال truffle console - لذلك testrpc طريقة التحقق لـ testrpc فقط بكيفية تمكين geth بعد ذلك. وهكذا ، أطلقنا اختبار بلوكشين الكفير المحلي:

 testrpc 

أم ... هذا كل شيء. يمكنك محاكاة بلوكشين الكفير محليًا.

ومن أجل geth --testnet --rpc الأثير للاختبار ، بدلاً من هذا الأمر ، ستحصل على - geth --testnet --rpc . ومن أجل الانتشار في blockchain الحقيقي للأثير ، يمكنك ببساطة geth --rpc . هناك حاجة إلى علامة --rpc بحيث يمكن توصيل الكمأة. خطوات النشر والاختبار التالية هي نفسها تقريبًا لجميع الأنواع الثلاثة من blockchain. الشيء الوحيد هو أنه بعد تشغيل الاختبار أو blockchain الحقيقي عبر geth ، سيبدأ في مزامنة الكتل - وهذا يمكن أن يستغرق ما يصل إلى 4-5 ساعات على اتصال إنترنت جيد. ملاحظة حول هذا كانت في بداية المقال. قبل نشر العقود الذكية ، أوصي بانتظار المزامنة الكاملة. أيضا ، يزن blockchain في منطقة 60-100 جيجا بايت ، لذلك قم بإعداد مساحة القرص لهذا.
أيضًا ، تأكد من إلغاء تأمين web3.eth.accounts[0] . يمكنك عادةً تسجيل testrpc في وحدة التحكم ، التي تفتح على الفور ، أو في نافذة طرفية منفصلة في وحدة التحكم ، والتي تفتح عبر geth console eth.unlockAccount(eth.accounts[0], ", ", 24*3600) : eth.unlockAccount(eth.accounts[0], ", ", 24*3600) - سيؤدي هذا إلى فتح حسابك ، والذي يجب أن ينشئ عقدًا ذكيًا

الآن افتح نافذة طرفية جديدة (لا نغلق testrpc - يجب أن تعمل) واكتبها في مجلد المشروع:

 truffle migrate --reset 

سيجمع هذا الأمر السحري عقدًا ذكيًا (أي أنك لا تحتاج إلى كتابة truffle compile كل مرة) ونشره على خادم blockchain الصغير الموجود محليًا. تجدر الإشارة إلى أنه إذا قام testrpc بذلك على الفور ، فإن الاختبار و blockchains الحقيقي سيشمل المعاملة في الكتل التالية لفترة أطول. بعد ذلك ، يجب أن تبصق شيئًا كهذا في وحدة التحكم:

 Using network 'development'. Running migration: 1_initial_migration.js Running step... Replacing MyToken... ... 0x86a7090b0a279f8befc95b38fa8bee6918df30928dda0a3c48416454e2082b65 MyToken: 0x2dc35f255e56f06bd2935f5a49a0033548d85477 Replacing MyCrowdsale... ... 0xf0aab5d550f363478ac426dc2aff570302a576282c6c2c4e91205a7a3dea5d72 MyCrowdsale: 0xaac611907f12d5ebe89648d6459c1c81eca78151 ... 0x459303aa0b79be2dc2c8041dd48493f2d0e109fac19588f50c0ac664f34c7e30 Saving artifacts... 

أعتقد أنك أدركت بالفعل أن وحدة التحكم MyToken عناوين العقود الذكية MyToken و MyCrowdsale . هذا كل شيء! يتم تضمين العقد الذكي في سلسلة الكتل التي تم فتح خادمها الصغير. يبقى فقط للتحقق من أن الرموز المميزة يتم توزيعها بالفعل على المستخدمين الذين يرسلون الكفير إلى عقد MyCrowdsale الذكي. نكتب ما يلي في المحطة الطرفية لدخول وحدة الكمأة:

 truffle console 

نكتب ما يلي في الكمأ الآن (لا تعليق فقط):

 //   - t="0x2dc35f255e56f06bd2935f5a49a0033548d85477" //     MyToken ="0xaac611907f12d5ebe89648d6459c1c81eca78151" //     MyCrowdsale //   - token=MyToken.at(t) crowdsale=MyCrowdsale.at(c) //       account=web3.eth.accounts[0] // ,      token.balanceOf(account) //   0 //    - web3.eth.sendTransaction({from: account, to:c, value: web3.toWei(0.1, 'ether'), gas: 900000}) 

testrpc , , — , , . ? MyToken :

 // ,      token.balanceOf(account) //     

هذا كل شيء! testrpc , geth --testnet , geth . ICO! . , OpenZeppelin, , . truffle — . , , - — . -, , .

الخلاصة


, ! , - , . , , ICO — $75,000 -, -, , - 25 .

-! ? — .

مكافأة


ولكن ماذا لو كنت تريد تغيير المنطق الذي يعتبر به سعر شراء الرموز المميزة؟ بالطبع ، يمكنك تغييره بشكل صحيح rateأو استخدام أحد فئات العقود من OpenZeppelin ، ولكن ماذا لو كنت تريد شيئًا أكثر انحرافًا؟ في العقد الذكي ، يمكنك تجاوز الوظيفة على getTokenAmountالنحو التالي:

 function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) { if (block.timestamp < 1533081600) { // August 1st, 2018 rate = rate * 4; } else if (block.timestamp < 1546300800) { // January 1st, 2019 rate = rate * 2; } return _weiAmount.mul(rate); } 

بشكل عام ، يمكن أن يجعل هذا سعر الرمز المميز يعتمد على وقت الشراء - كلما زادت المسافة في الغابة ، زادت تكلفة الرموز المميزة. لا تخف من تجربة بعض ميزات العقود الذكية وإعادة كتابتها - إنها ممتعة!

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


All Articles