Cara menulis kontrak pintar untuk ICO dalam 5 menit



Halo semuanya! Pada artikel ini saya akan memberi tahu Anda cara meluncurkan kontrak pengumpulan uang pintar untuk ICO Anda di Ethereum dalam 5 menit dan beberapa perintah di terminal. Esai ini berpotensi menghemat puluhan ribu dolar AS, karena setiap programmer - dan bukan programmer juga - akan dapat meluncurkan kontrak pintar yang diaudit dan aman (alih-alih membayar $ 15.000 - $ 75.000 untuk pengembangan). Singkatnya, Anda dapat mengirim uang ke kontrak pintar ini dan menerima token ERC20 untuk itu. Dapat dikatakan bahwa artikel ini adalah kumpulan dari semua pengalaman yang saya peroleh dengan meluncurkan ICO untuk proyek saya.

Di Internet, ini dari Anda sudah penuh dengan artikel tentang kontrak pintar, tetapi segera setelah Anda mulai menulis satu, Anda menemukan fakta bahwa informasi tersebut diulang di mana-mana, dan tidak ada tutorial tentang cara menipu ERC20 Anda, atau sudah usang. Ngomong-ngomong, agar artikel ini tetap relevan, saya akan mencoba menunjukkan tempat-tempat potensial di mana artikel itu menjadi usang (dan bagaimana cara memperbaikinya). Ayo pergi!

Soliditas


Ini adalah nama bahasa utama yang dikembangkan tim kefir untuk meluncurkan kontrak cerdas. Jika Anda seorang programmer, maka cukup periksa dokumentasi bahasa - itu tidak senonoh sederhana. Omong-omong, mereka membuatnya sederhana sehingga lebih sulit untuk membuat kesalahan dalam menulis kontrak yang cerdas. Jadi benar-benar programmer mana pun , setidaknya di tingkat junior, akan dapat mengetahuinya. Sama sekali tidak ada gunanya membayar sejumlah besar uang kepada pengembang yang tahu soliditas - itu akan menjadi urutan lebih murah untuk melatih pengembang yang ada.

Kontrak yang cerdas


... dan semua yang perlu Anda ketahui tentang mereka. Lewati bagian ini jika Anda bukan seorang programmer. Kontrak yang cerdas adalah sepotong kode. Pada prinsipnya, ini adalah kelas dalam soliditas (OOP, ya), yang memiliki dua jenis fungsi: state-changing dan non-state-changing. Nah, untuk menjalankan fungsi dalam kontrak pintar hanya dengan mengirim kefir untuk itu, Anda harus menandai fungsi ini payable .

State adalah gudang data, blockchain, EPT. Kontrak dapat mengubah blockchain (status, penyimpanan) - tetapi untuk mengubah blockchain Anda harus membayar kefir ke penambang. Bagaimana mereka akan membagikan kefir tidak akan dianalisis dalam kerangka artikel ini. Pembayaran kepada penambang untuk menjalankan kode yang diubah negara disebut Gas. Jika seseorang dari luar melempar kefir ke alamat kontrak pintar dengan panggilan ke fungsi yang ditandai payable tetapi tidak ditandai Constant , View atau Pure , maka jumlah kefir yang diperlukan untuk pembayaran kepada penambang akan dikurangkan dari jumlah yang dikirim. Biasanya, dalam token ERC20, ini adalah fungsi yang memberikan pengirim token untuk kefir atau mentransfer token dari satu pemegang token ke yang lain.

Dan jika Anda menandai suatu fungsi dalam kontrak dengan kata Constant atau View (artinya sama, mereka hanya memungkinkan Anda membaca status) atau Pure (hal yang sama, Anda bahkan tidak membaca keadaan), maka Anda bahkan tidak perlu mengeluarkan kefir untuk fungsi ini! Saya bahkan akan mengatakan lebih banyak bahwa fungsi-fungsi ini tidak perlu dipanggil oleh transaksi - setelah semua, klien yogurt dapat secara teoritis menjalankannya di rumah - dan tidak ada yang perlu tahu tentang ini lagi (lagi pula, tidak ada yang ditulis ke blockchain).

Dan ada dua hal penting dalam soliditas: multiple inheritance dan function modifiers. Anda juga perlu tahu tentang mereka.

Kontrak pertama yang adil dapat diwarisi secara simultan dari beberapa kelas seperti TimedCrowdsale , CappedCrowdsale , MintedCrowdsale , Ownable - pada saat yang sama, fungsi konstruktor juga diluncurkan satu demi satu - tetapi saya akan menjelaskan ini nanti sebagai contoh.

Yang kedua adalah kemampuan untuk membuat fungsi yang kemudian akan dimasukkan ke fungsi lain. Ini seperti enkapsulasi sederhana, hanya sedikit lebih fleksibel - ini sebenarnya adalah templat fungsi. Ketika Anda membuat pengubah, Anda menulis karakter khusus _ mana Anda maksud kode fungsi menggunakan pengubah ini. Artinya, pengubah bukan hanya fungsionalitas yang dienkapsulasi yang mengembalikan nilai; ini adalah templat fungsi ketika kode dari pengubah secara harfiah dimasukkan ke dalam fungsi menggunakan pengubah ini.

Mari kita lanjutkan berlatih.

Lingkungan memasak


Jika Anda tidak tahu apa itu Terminal, baca artikel ini di sini . Jika Anda berada di windows, tentukan sendiri Terminal melalui WLS. Jika Anda sudah terbiasa dengan Terminal, mari kita lanjutkan. Juga, segera tempatkan sendiri Node.js - itu akan diperlukan untuk langkah selanjutnya. Lebih baik untuk menginstal LTS, tetapi, pada kenyataannya, tidak ada bedanya yang mana dari versi modern dari node untuk menginstal.

Hal pertama yang kami segera instal dan memulai proses sinkronisasi blok adalah geth . Singkatnya, ini adalah utilitas yang ditulis dalam Go yang akan memungkinkan kita untuk menjalankan node eter pada komputer lokal dan terhubung ke jaringan tes dan nyata. Anda dapat menginstal melalui installer , tetapi saya sangat menyarankan Anda segera mendapatkan di Terminal, seperti dijelaskan di sini . Anda dapat memeriksa apakah standar geth Anda geth menjalankan perintah di Terminal:

 geth version 

Jika Anda memuntahkan versi geth - semuanya dalam kerawang, lanjutkan tutorialnya. Jika tidak - buruk, benar; tampaknya Anda harus bercinta dengan Terminal dan sistem operasi Anda - tetapi ini bukan pertama kalinya bagi Anda untuk mengetahuinya. Cara menginstal geth, jalankan perintah di Terminal:

 geth --testnet console 

Ini akan memulai proses sinkronisasi simpul Anda dengan server uji, yang blok-bloknya dapat dilihat di sini . Anda dapat memeriksa apakah Anda menyinkronkan dengan jaringan di konsol geth dengan geth :

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

Proses sinkronisasi membawa saya dari 1 hingga 4 jam - saat bagaimana. Selain itu, selain memblokir sinkronisasi, Anda juga harus menunggu sinkronisasi keadaan - seringkali lebih lama dari memblokir sinkronisasi. Anda juga dapat menggunakan geth --light flag --light - lalu sinkronisasi berlangsung dari beberapa detik hingga satu menit dan Anda masih dapat menggunakan kontrak.

Oke, kami menginstal utilitas pertama - menempatkan yang berikutnya. Kita perlu meletakkan analog geth , hanya simulasi blockchain yang sangat lokal - testrpc . Ya, kami memiliki 3 blokir :

  • testrpc - simulasi blockchain lokal; cepat, tetapi palsu dan hanya disimpan di mesin Anda
  • geth --testnet sudah menjadi blockchain nyata, tetapi Anda tidak akan kehilangan uang di mana Anda bisa mendapatkan kefir dan menguji semua geth --testnet - geth --testnet secara gratis
  • geth - mainnet, main, blockchain nyata, kefir nyata; semua dengan cara dewasa, kesalahan di sini adalah kerugian kefir nyata

Dengan demikian, kita akan memulai kontrak pengujian dengan testrpc , kemudian menginstalnya di geth --testnet , dan kemudian mengunduhnya langsung di geth .

Kami testrpc dengan menjalankan perintah berikut:

 npm install -g ethereumjs-testrpc 

Ya, atau langsung naik dengan truffle, karena sekarang testrpc bawah sayap truffle dan disebut ganache-cli . Meskipun iblis tahu, semuanya bekerja dengan testrpc dengan vanilla testrpc . Dan jika berhasil, jangan menyentuhnya, karena saya diajarkan di akademi intergalaksi. Anda juga dapat menjalankannya untuk memverifikasi instalasi dengan mendaftarkan truffle di konsol, tetapi test blockchain sudah disinkronkan dengan kami - jangan ganggu.

Nah, sudah menemukan blockchain? Sekarang ada node dan tes bahkan disinkronkan? Kami menempatkan utilitas yang nyaman untuk bekerja dengan kontrak pintar di kefir - truffle , dengan perintah berikut:

 npm install -g truffle truffle version #  ,  ,   

Truffle adalah alat yang memungkinkan Anda untuk menjaga kontrak pintar dalam file yang berbeda, mengimpor file lain, dan juga mengkompilasi kode kontrak pintar Anda menjadi satu bytecode besar (tidak dapat dibaca oleh seseorang), itu secara otomatis menemukan geth berjalan secara lokal (uji dan nyata ) atau testrpc , sebarkan kontrak pintar Anda ke jaringan ini. Selain itu, periksa kode kontrak pintar Anda untuk kesalahan dan transaksi yang baru saja diselesaikan juga membantu debug . Masthead, singkatnya.

Pada tahap ini Anda harus menginstal: testrpc , testrpc , truffle - jika ada yang hilang atau versi tidak dimuntahkan ke konsol atas permintaan, maka perbaiki ini; jika tidak, Anda tidak akan berhasil.

Juga, saya melemparkan skrip bash sederhana yang akan menginstal semuanya untuk Anda. Disebut seperti ini:

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

- tapi saya belum pernah mengujinya, jadi saya tidak yakin dengan kinerjanya. Namun, saya akan senang menarik permintaan.

Kontrak Figash


Semuanya telah ditemukan dan ditulis untuk Anda - itu bagus. Bunting kecil akan tetap sama - tetapi saya akan mencoba meminimalkannya untuk Anda. Kami akan menggunakan kontrak ERC20 yang sudah jadi dari OpenZeppelin - sekarang ini adalah standar industri, mereka telah lulus audit, dan memang mereka semua menggunakan kode mereka. Terima kasih banyak atas kontribusi Anda pada open source.

Buat cd ke folder aman dan kemudian tulis:

 mkdir contract && cd contract 

Dalam folder ini kita akan bekerja. Buat rintisan di sini untuk kontrak pintar kami:

 truffle init 

Tersandung, jelas. Kami sekarang memiliki dua folder yang sangat penting di mana kami akan naik: contracts dan migrations . Yang pertama adalah kode untuk kontrak kami, yang kedua adalah kode untuk truffle untuk mengetahui apa yang harus dilakukan ketika menggunakan kontrak ke blockchain.

Selanjutnya, kita perlu mengambil kode kontrak pintar saat ini dari npm dan, pada kenyataannya, memulai proyek itu sendiri:

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

Nah, kode kontrak pintar dari OpenZeppelin ada di saku kita di folder node_modules/openzeppelin-solidity/contracts . Sekarang kita pergi ke folder contracts utama, hapus semua file di sana dan tambahkan file MyToken.sol dan MyCrowdsale.sol - tentu saja, Anda akan memberi nama kontrak Anda secara berbeda. Yang pertama akan menjadi kontrak untuk Token ERC20 kami, dan yang kedua akan menjadi kontrak ICO kami, yang akan menerima kefir dan mendistribusikan MyToken orang MyToken orang. Artikel ini mungkin sudah usang, tetapi Anda selalu dapat melihat bagaimana OpenZeppelin menyarankan Anda membuat kontrak dalam repositori mereka . Beginilah tampilan 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; } 

Bagus - Anda memiliki kontrak pintar token Anda sendiri (cukup ganti nama dalam konstanta)! Anda dapat melihat MintableToken warisan apa dari MintableToken - tetapi semuanya sesederhana mungkin di sana. Ini adalah token yang dapat dikeluarkan (dari bahasa Inggris "Mint" - untuk mint), dan hanya pemilik yang memiliki hak untuk menerbitkannya, karena MintableToken juga diwarisi dari Ownable . Selain itu, MintableToken juga mewarisi dari kelas token ERC20 yang ditulis oleh OpenZeppelin, di mana antarmuka ERC20 diimplementasikan:

 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); } 

Ya, di sini Anda memiliki seluruh antarmuka ERC20. Apakah ini sulit? Saya kira tidak. Ini memberi Anda kesempatan untuk melihat berapa banyak token yang dikeluarkan, memeriksa saldo alamat, dan mentransfer token ke alamat lain dengan memuntahkan acara transfer untuk pelanggan kefir ringan di jaringan. Dan semua ini Anda dapatkan gratis di MyToken.sol berkat karya OpenZeppelin - semuanya hebat.

Dan sekarang mari kita beralih ke bagian utama ICO kita - kita harus menerima kefir dan membagikan MyToken ! MyCrowdsale.sol tampilan MyCrowdsale.sol Anda:

 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); } } 

Begitu-begitu-begitu, ada apa dengan kita? Apa, bocah, kontrak pintar? Penjualan token kami secara umum mewarisi tiga properti paling populer: memiliki token, yang tidak dapat dikumpulkan lagi; topi lunak, tidak mengumpulkan ester mana yang dikembalikan; waktu awal dan akhir penjualan token. Faktanya, apa lagi yang dibutuhkan untuk kebahagiaan?

Programmer, perhatikan bagaimana konstruktor dari beberapa kelas pewarisan disusun secara berurutan dan mendapatkan argumen dari konstruktor utama MyCrowdsale . Kami juga memeriksa bahwa hardkey lebih tinggi dari softkey - Ales Gut! Juga, jangan MyCrowdsale parameter yang MyCrowdsale di konstruktor MyCrowdsale - kami akan meneruskannya pada tahap penyebaran kontrak di truffle.

Itu saja - Anda memiliki kontrak siap pakai token ERC20 Anda sendiri dan bahkan kontrak pintar ICO, yang dikonfigurasi sesuai dengan keinginan Anda dan memberikan token Anda untuk kefir. Juga, didukung oleh semua dompet ERC20 - sebuah kesalahan besar! Mari beralih ke tes dan penerapan manual.

Migrasi


Seperti yang saya katakan sebelumnya, kami akan menguji secara berurutan pada tiga jaringan blockchain, tetapi proses pengujian dengan pena akan selalu sama. Mari kita mulai dengan testrpc , kemudian beralih ke geth --testnet dan lanjutkan geth . Lampu utama Sou, kami baru saja menulis kodenya, mari kita coba kompilasi. Dalam folder proyek, tulis:

 truffle compile 

Jika semuanya dikompilasi tanpa masalah, maka Anda akan melihat build , yang akan berisi krakozyab untuk truffle sehingga itu bisa menyematkan bytecode kontrak pintar Anda di blockchain. Sebelum menerapkan kontrak pintar, kami perlu memberi tahu truffle apa yang harus dilakukan. Penyebaran truffle dari kontrak pintar disebut migrasi - yah, mari kita berpegang pada terminologi ini. Buka migrations/1_initial_migration.js dan ubah dengan cara berikut:

 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); }); }; 

Ini adalah file yang sama yang akan digunakan oleh truffle untuk menyebarkan kontrak. Jadi apa yang kita lakukan di sini? Pertama, kami meminta kompilasi MyToken dan MyCrowdsale . Setelah itu, kami menetapkan konstanta dengan semua argumen ICO kami - mengatur waktu mulai dan berakhir; berapa banyak token yang akan diterima orang untuk 1 ve kefir (0,000000000000000001 et = 1 wei; menetapkan decimals menunjukkan berapa banyak pesanan yang diperlukan untuk mendapatkan 1 token yang baru Anda buat); dompet, tempat kefir yang diperoleh dari penjualan akan datang; topi keras dan topi lunak. Harap perhatikan bahwa openingTime harus selalu setelah waktu blok saat ini di blockchain - jika tidak, kontrak pintar Anda tidak akan diblokir karena memeriksa kondisi di TimedCrowdsale . Saya menginjak rake ini, dan transaksi yang gagal tidak dapat didebet sama sekali. Ubah konstanta ini sesuai keinginan.

Langkah selanjutnya adalah penyebaran kontrak pintar. Tidak ada yang menarik di sini: kami memiliki objek penggunaan yang menyebarkan artefak kontrak pintar dan memberikan argumen di sana. Perhatikan bahwa MyToken MyToken terlebih dahulu, dan hanya kemudian MyCrowdsale - dan alamat yang pertama dilewatkan di yang kedua sebagai argumen.

Kemudian hal yang paling menarik adalah apa yang tidak mereka tulis di dokumentasi atau di buku. Saat Anda membuat MyToken dari dompet, dompet ini menjadi pemilik MyToken di superclass yang Dapat Ownable - hal yang sama terjadi dengan MyCrowdsale . Jika Anda menggali lebih dalam ke dalam MintableToken , Anda dapat melihat bahwa hanya Owner dapat mencetak koin! Dan siapa pemilik MyToken ? Itu benar: alamat yang membuatnya kesal. Dan siapa yang akan mengirim permintaan untuk mencetak koin? Benar: MyCrowdsale pintar MyCrowdsale . Biarkan saya mengingatkan Anda bahwa alamat yang membuat MyToken dan MyCrowdsale adalah dua alamat yang berbeda.

Oleh karena itu, kami menambahkan langkah penyebaran ketiga non-Ortodoks, di mana alamat yang telah melanggar kontrak ( web3.eth.accounts[0] ) menyebut fungsi transferOwnership MyToken kontrak MyToken MyCrowdsale memiliki MyToken dan dapat mencetak koin. Dan MyCrowdsale masih di bawah kepemilikan web3.eth.accounts[0] - jadi semuanya dibundel.

Catatan tentang web3.eth.accounts[0] : ketika menggunakan kontrak pintar, pastikan geth atau testrpc memiliki dompet yang benar di web3.eth.accounts[0] - jangan kehilangan kunci pribadi untuk itu, meskipun ini tidak membahayakan Anda, tetapi tiba-tiba pemilik perlu melakukan sesuatu nanti, tetapi kuncinya sudah tidak ada lagi?
Di testrpc , sebagai aturan, akun dibuat segera saat startup dan mereka segera dibuka; namun, pada tes dan blockchain udara nyata, ada baiknya membuat akun melalui personal.newAccount() - kemudian mengisi kembali alamat ini melalui Faucet pada rantai blockchain tes atau kefir nyata pada blockchain nyata. Jangan kehilangan kata sandi dan kunci pribadi Anda.
Anda juga dapat menambahkan dompet yang ada ke akun Anda dengan menelepon web3.personal.importRawKey('pvt_key', 'password') , tetapi untuk ini Anda perlu memanggil geth dengan parameter tambahan --rpcapi="db,eth,net,web3,personal,web3" . Saya pikir Anda akan mengetahuinya.

Pengujian dan Penempatan


Ya, kontraknya sudah siap, migrasi ditulis, tetap hanya untuk digunakan dan diperiksa. Baik geth (test dan real) dan testrpc dikelola dengan cara yang sama melalui truffle console - jadi saya akan menjelaskan metode verifikasi untuk testrpc dan hanya memberi tahu Anda cara mengaktifkan geth setelahnya. Jadi, kami meluncurkan blockchain kefir lokal uji:

 testrpc 

Um ... itu saja. Anda mensimulasikan blockchain kefir secara lokal.

Dan untuk menyebarkan ke blockchain tes ether, bukannya perintah ini, Anda akan mendapatkan geth --testnet --rpc . Dan untuk menggunakan blockchain eter yang sebenarnya, Anda cukup geth --rpc . Bendera --rpc diperlukan agar truffle dapat terhubung. Langkah-langkah penyebaran dan pengujian berikut kurang lebih sama untuk ketiga jenis blockchain. Satu-satunya hal adalah bahwa setelah Anda menjalankan tes atau blockchain nyata melalui geth , itu akan mulai menyinkronkan blok - dan ini bisa memakan waktu hingga 4-5 jam pada koneksi internet yang baik. Sebuah komentar tentang ini adalah di bagian paling awal artikel. Sebelum menggunakan kontrak pintar, saya sarankan menunggu sinkronisasi penuh. Juga, blockchain berbobot di wilayah 60-100 gigabyte, jadi siapkan ruang disk untuk ini.
Selain itu, pastikan web3.eth.accounts[0] dikunci. Anda biasanya dapat mendaftarkan testrpc di konsol, yang segera terbuka, atau di jendela Terminal terpisah di konsol, yang terbuka melalui geth console : eth.unlockAccount(eth.accounts[0], ", ", 24*3600) - ini akan membuka kunci akun Anda, yang akan membuat kontrak pintar

Sekarang buka jendela Terminal baru ( testrpc tidak menutup testrpc - seharusnya berfungsi) dan menuliskannya di folder proyek:

 truffle migrate --reset 

Perintah ajaib ini akan mengkompilasi kontrak pintar (yaitu, Anda tidak perlu menulis truffle compile setiap kali) dan menyebarkannya ke server mikro blockchain yang ditemukan terbuka secara lokal. Perlu dicatat bahwa jika testrpc melakukan ini secara instan, maka test dan blockchains nyata akan memasukkan transaksi dalam blok berikutnya lebih lama. Setelah itu, Anda harus memuntahkan sesuatu seperti ini di konsol:

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

Saya pikir Anda sudah menyadari bahwa konsol memberi Anda alamat kontrak pintar MyToken dan MyCrowdsale . Itu saja! Kontrak pintar tertanam dalam blockchain yang server mikronya Anda buka. Tetap hanya untuk memverifikasi bahwa token benar-benar didistribusikan kepada pengguna yang mengirim kefir ke kontrak pintar MyCrowdsale . Kami menulis yang berikut ini di Terminal untuk memasuki konsol truffle:

 truffle console 

Kami menulis yang berikut ini di truffle sekarang (tidak ada komentar saja):

 //   - 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}) 

Jika demikian, testrpcAnda dapat segera memeriksa saldo dompet kami lagi, tetapi dalam kasus pengujian dan blockchain nyata, Anda harus menunggu sampai transaksi kami termasuk dalam blokir - biasanya ketika ini terjadi, truffle memberi Anda nomor transaksi. Apakah kamu sudah menunggu? Periksa lagi saldo kami di MyToken:

 // ,      token.balanceOf(account) //     

Itu saja!Pertama, uji kontrak Anda pada testrpc, kemudian pada geth --testnet, kemudian gunakan pada geth. Jadi, Anda meluncurkan ICO Anda sendiri! Dan Anda tidak perlu menghabiskan puluhan kilogram untuk audit dan peluncuran. Untuk mengacaukan apa yang diberikan orang-orang dari OpenZeppelin kepada kami sebenarnya sangat sulit. Dan ketika Anda menggunakannya truffle- inilah bagaimana perkembangan solidaritas umumnya berubah menjadi dongeng. Nah, kecuali untuk kasus-kasus ketika transaksi dibalik selama eksekusi dengan kontrak pintar - debutkan neraka mereka. Tetapi debugging kontrak pintar benar-benar layak untuk artikel terpisah.

Kesimpulan


Terima kasih banyak telah membaca hingga akhir artikel ini! Jika saya berhasil menghemat waktu atau uang Anda, atau jika Anda mempelajari sesuatu yang baru dari artikel ini, maka saya akan sangat senang karenanya. Saya juga akan sangat berterima kasih jika Anda berbagi artikel ini dengan teman atau kenalan yang ingin melakukan ICO - hemat $ 75.000 untuk para programmer yang menyedot uang dari pasar crypto seperti parasit, menyalin-menempelkan 25 baris kode yang sama .

Semoga sukses dalam mengembangkan kontrak pintar! Masih ada pertanyaan? Saya meminta Anda dalam komentar - Saya akan dengan senang hati menjawab semuanya dan mencoba membantu dengan masalah.

Bonus


Tetapi bagaimana jika Anda ingin mengubah logika dengan mana harga pembelian token dipertimbangkan? Tentu saja, Anda dapat mengubahnya dengan benar rateatau menggunakan salah satu kelas kontrak dari OpenZeppelin, tetapi bagaimana jika Anda menginginkan sesuatu yang lebih mesum? Dalam kontrak pintar, Anda dapat mengganti fungsi getTokenAmountsebagai berikut:

 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); } 

Secara umum, ini dapat membuat harga token bergantung pada waktu pembelian - semakin jauh ke dalam hutan, semakin mahal tokennya. Jangan takut untuk bereksperimen dan menulis ulang beberapa fitur kontrak pintar - itu menyenangkan!

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


All Articles