Alat Terbaik untuk Pengembangan Kontrak Cerdas
Pendahuluan: Pengembangan Kontrak Cerdas
Ini adalah posting tamu oleh KC TAM tentang Menggunakan Berbagai Alat untuk Pengembangan Kontrak Cerdas: Remix, Web3 di TestRPC.
Saya baru-baru ini membaca sebuah artikel bagus tentang Blockgeeks, di mana Ameer mencoba untuk meletakkan segala sesuatu tentang pengkodean Aplikasi Terdesentralisasi menjadi satu karya besar. Sungguh pekerjaan yang sangat ambisius dan hebat! Di antaranya ada beberapa komponen, dan saya ingin menguraikan sedikit tentang beberapa alat ini, dan bagaimana mereka dapat digunakan untuk pengembangan kontrak.
Seri artikel ini bukan untuk platform Smart Contract 101 atau Ethereum. Anda pasti dapat menemukan banyak materi bagus di Blockgeeks. Tapi saya yakin dengan melewati ini, Anda akan mengambil beberapa ide tentang alat-alat ini dan berharap ini membantu ketika Anda sedang mengerjakan Kontrak Cerdas dengan Soliditas .
Pertama-tama saya akan membuat deskripsi singkat tentang Kontrak Cerdas yang telah saya pilih. Dan kemudian menyebarkan kontrak ini di empat lingkungan. Berikut ini ringkasan singkat dari empat lingkungan yang kami tampilkan di sini.
Aliran Sederhana Penyusunan dan Penerapan Kontrak
Contoh Kontrak Cerdas: Pembagian Pendapatan
Aplikasi ini diambil dari Kontrak Cerdas di Bab 4: Akun Ethereum dari buku ” AplikasiBlockchain Pendekatan Praktis” oleh A. Bahga dan V. Madisetti. Telah dimodifikasi agar sesuai dengan beberapa persyaratan pada rilis terbaru Solidity.
Aplikasi ini disebut Revenue Sharing. Singkatnya, daftar alamat diberikan ketika kontrak digunakan. Siapa pun dapat mengirim sejumlah uang tertentu (ini adalah eter atau denominasi eter) dan jumlah uang ini didistribusikan secara merata ke alamat yang tercantum dalam daftar. Ini adalah kontrak Soliditas yang agak sederhana.
Inilah Soliditas Kontrak Cerdas.
pragma solidity ^ 0.4.8; kontrak RevenueSharing { alamat pembuat publik; mapping (uint => address) pemegang saham publik; bukan pemegang saham publik; acara Disburse (uint _amount, uint _numShareholder); function RevenueSharing (address [] address) { creator = msg.sender; numShareholder = address.length; untuk (uint i = 0; i <address.length; i ++) { pemegang saham [i] = alamat [i]; } } function shareRevenue () pengembalian terutang (bool success) { jumlah uint = msg.value / numShareholder; untuk (uint i = 0; i <numShareholder; i ++) { jika (! pemegang saham [i]. kirim (jumlah)) kembalikan (); } Disburse (msg.value, numShareholder); kembali benar; } function kill () { if (msg.sender == creator) selfdestruct (creator); } }
Beberapa poin cepat tentang kontrak ini
Kontrak tersebut bernama RevenueSharing.
Function RevenueSharing () memiliki nama yang sama dengan kontrak itu sendiri. Itu adalah konstruktor, dan hanya dipanggil sekali ketika kontrak digunakan. Kita melihat dalam kontrak ini array alamat disediakan, dan array alamat ini disimpan dalam array lain yang disebut pemegang saham.
Function shareRevenue () adalah satu-satunya fungsi utama dalam kontak ini. Saat menjalankan fungsi ini dengan sejumlah eter (dalam nilai msg), jumlah tersebut dibagi ke dalam jumlah pemegang saham (numShareholder), dan setiap alamat dalam array pemegang saham akan mendapatkan bagiannya. Kami akan menjalankan fungsi ini di demo kami.
Function kill () digunakan untuk menghapus kontrak. Kami tidak akan menggunakan fungsi ini dalam demo.
Perhatikan bahwa semua variabel didefinisikan dengan publik. Ini membantu kita untuk mengamati lebih detail dalam kontrak. Dalam kehidupan nyata, kita harus berhati-hati ketika membuat variabel atau fungsi publik karena pertimbangan keamanan.
Remix
Ikhtisar
Remix adalah seperangkat alat untuk berinteraksi dengan blockchain Ethereum untuk men-debug transaksi (dikutip langsung dari sini ). Ada versi IDE (Remix IDE) dan versi online, yang akan kita gunakan di sini.
Ada banyak alat di dalam Remix, tetapi alat-alat berikut ini menarik minat kami,
- Kompiler Soliditas. yang menghasilkan banyak informasi berguna yang akan kita gunakan di lingkungan lain
- Lingkungan Runtime. Remix menyediakan tiga:
- Web3 yang disuntikkan: ke penyedia seperti Mist atau MetaMask
- Penyedia Web3: untuk host lokal melalui IPC
- JavaScript VM: lingkungan yang disimulasikan
Di antara lingkungan runtime, kami menggunakan JavaScript VM. Dalam JavaScript VM, Remix hadir dengan lima akun Ethereum, yang masing-masing disimpan dengan 100 eter. Ini cukup baik untuk menguji kontrak pintar kami. Juga, penambangan tidak diperlukan karena dilakukan secara otomatis.
Anda dapat dengan mudah mengakses Remix dari browser apa pun (url: http://remix.ethereuem.org ). Ini adalah tangkapan layar Remix.
Layar dibagi menjadi beberapa area.
- Area untuk Kontrak Cerdas: kami menempelkan kode kontrak Soliditas di sini.
- Area Kompilasi dan Runtime: di tag Kompilasi, di sini menunjukkan kesalahan kompilasi atau peringatan. di Jalankan tag, kami menggunakan kontrak dan menjalankan fungsi kontrak.
- Area Log Transaksi: semua detail transaksi dapat diamati di sini.
Kompilasi Kontrak
Kami menempelkan kode Kontrak Cerdas dalam Remix.
Kami memperhatikan bahwa kode ini dikompilasi secara otomatis, dan ada beberapa peringatan. Karena itu bukan kesalahan kritis, kami aman untuk bergerak maju.
Jika kami mengklik Rincian, kami akan melihat banyak informasi untuk kontrak ini. Di antara mereka,
- Bytecode
- ABI
- Web3 Menyebarkan
Mereka diperlukan saat menggunakan kontrak ini di lingkungan lain. Kami akan merujuk ini kembali nanti.
Karena kami tidak melihat kesalahan setelah kompilasi, kami dapat menjalankan kontrak ini ke lingkungan JavaScript Remix.
Menyebarkan Kontrak
1. Sekilas di dalam Run Tag
Seperti di dalam tag Run.
Dari Lingkungan, pilih JavaScript VM.
Setelah memilih JavaScript VM, kita akan melihat beberapa akun diisi di bidang Akun.
Dan seperti yang dikatakan, masing-masing 100 pra-setor disimpan, hanya untuk pengujian. Karena kita akan menggunakan akun ini nanti, kita dapat menyalinnya terlebih dahulu.
Batas Gas adalah untuk menentukan berapa banyak gas yang dapat kita keluarkan untuk setiap transaksi. Karena kita berada di lingkungan pengujian, kita tidak terlalu khawatir. Saya telah mencoba beberapa penyebaran kontrak besar dan batas gas standar tidak memadai. Bagaimanapun, itu dapat ditingkatkan ke nilai apa pun saat dibutuhkan.
Bagian Nilai adalah tempat kami mengirimkan jumlah eter selama penerapan kontrak dan menjalankan suatu fungsi. Dalam kasus kami, kami tidak memberikan nilai apa pun dalam penerapan kontrak, tetapi memberikan beberapa eter saat menjalankan fungsi. Lihat di bawah untuk detail lebih lanjut.
2. Menyebarkan Kontrak
Sekarang kita melihat kontrak RevenueSharing sudah dipilih (kita hanya punya satu kontrak dalam kode kita). Kami akan menggunakan tombol Buat untuk menyebarkan kontrak ini ke JavaScript VM.
Sesuatu diperlukan, seperti yang ditunjukkan pada area input: “address [] address”, ketika kontrak digunakan. Ingat kontrak ini membutuhkan daftar alamat sebagai target berbagi? Untuk tujuan demo, kami akan menggunakan alamat 3, 4 dan 5 yang tercantum di atas sebagai daftar alamat. Jadi tempel ini di sebelah tombol Buat:
Sekarang pastikan kita sudah memilih
- Lingkungan: JavaScript VM
- Akun: akun pertama saat menggunakan kontrak ini (dimulai dengan 0xca3 …)
- Rekatkan larik alamat di atas di sebelah tombol Buat
Dengan menekan Buat, kita akan melihat hal berikut terjadi.
3. Setelah Kontrak Disebarkan
Kontrak sekarang digunakan dalam JavaScript VM (memori), dan alamat kontrak ditampilkan (0x692 …). Kami tidak menggunakan alamat ini dalam demo kami. Alamat itu dapat dirujuk dalam kasus lain bila diperlukan.
Juga, kita melihat variabel yang ditandai sebagai “publik” sekarang ditampilkan, yaitu,
- pemegang saham
- numShareholder
- pencipta
Dan dua fungsi yang telah kita definisikan dalam kontrak ini,
- bagi hasil ()
- membunuh()
Sebelum semuanya, kami mengamati bahwa saldo akun dikurangi oleh sejumlah kecil eter. Perbedaannya (417.626 weis, 1 wei = 10-18 ether) adalah biaya penempatan kontrak ini. Dalam kehidupan nyata, itu adalah eter nyata yang dikurangkan dari akun Anda saat Anda menggunakan kontrak.
Berinteraksi dengan Kontrak yang Ditempatkan
1. Periksa Variabel
Pertama-tama kita dapat memeriksa variabel dengan menekan tombol variabel. Di sini kami memeriksa numShareholder dan pembuat. Untuk pemegang saham, karena merupakan array, kita perlu menentukan indeks (0, 1 atau 2), sesuai dengan alamat yang kita masukkan ketika kontrak digunakan (dibuat).
Semua variabel seperti yang kita harapkan.
2. Menjalankan fungsi shareRevenue ()
Sekarang kami menjalankan shareRevenue (). Kami menggunakan akun pertama untuk menyetor 30 eter saat menjalankan fungsi ini (Ini hanya untuk fungsi ini. Dalam banyak kasus ini tidak diperlukan.). Menurut logika kontrak, 30 eter akan didistribusikan di antara daftar akun, yaitu akun 3, 4 dan 5 dalam daftar akun kami. Sampai sekarang, keseimbangan masing-masing masih 100 eter.
Kami menggunakan tempat yang sama untuk menjalankan fungsi. Di sini kami pastikan untuk,
- di bidang Akun, pilih akun pertama (dimulai dengan 0xca3 …)
- tempatkan 30 eter dalam Nilai
Lalu tekan shareRevenue.
Setelah fungsi dieksekusi, kami memeriksa saldo masing-masing akun, dan melihat apakah dieksekusi sesuai dengan desain kami.
Pertama, kita melihat 30 eter dikurangkan dari akun 1, dan ketiga akun di daftar sekarang memiliki 110 eter. Jadi 30 eter yang dikurangkan dari akun 1 sekarang didistribusikan di antara tiga akun. Bagian ini berfungsi sempurna sesuai dengan kontrak.
Juga, jika kita memeriksa dengan cermat saldo akun 1, beberapa jumlah eter tambahan dikurangkan. Perbedaannya adalah 47.776 wei, yang merupakan biaya untuk transaksi ini. Setiap transaksi, pelaksanaan fungsi, atau penyebaran kontrak akan dikenakan biaya sejumlah eter.
Log Transaksi
Kami belum menyentuh log transaksi selama pengujian kami, tetapi semuanya disimpan dalam log, bahkan penyelidikan variabel. Mari kita lihat detail dari dua log yang dipilih.
1. Penerapan Kontrak
Kita dapat melihat siapa yang telah menggunakan kontrak ini, alamat kontrak, dan biaya transaksi yang diperlukan untuk menggunakannya.
2. Eksekusi fungsi shareRevenue ()
Sekali lagi kita melihatnya sebagai biaya transaksi. Di shareRevenue (), ada nilai boolean kembali dan kami melihat “diterjemahkan” ada ada “benar” kembali. Kami juga memiliki acara untuk distribusi yang sukses dan kami melihatnya di dalam “log”.
Ringkasan
Inilah cara Remix membantu dalam menguji kode yang kami kembangkan. Itu datang dengan fitur yang sangat berguna dan antarmuka pengguna yang intuitif. Pada artikel selanjutnya kita akan menggunakan lingkungan lain, testrpc, untuk bekerja pada kontrak yang sama dan melihat cara kerjanya.
Alat Terbaik untuk Pengembangan Kontrak Cerdas Bagian 2: Web3 pada TestRPC
Ikhtisar
TestRPC adalah simulasi blockchain Ethereum, yang dilengkapi dengan 10 akun Ethereum yang telah ditentukan sebelumnya dan mendukung mnemonik (yaitu, seseorang dapat menghasilkan set akun yang sama dengan set mnemonik yang sama). Itu tidak datang dengan Antarmuka Pengguna sebagai Remix, dan kami membutuhkan konsol simpul plus pustaka web3 untuk berinteraksi dengan blockchain ini.
Persiapan
Demo ini dilakukan melalui baris perintah atau terminal. Gunakan alat terminal yang mendukung pemisahan layar. Saya menggunakan iTerm2 di Mac saya.
Instal node dan npm: silakan merujuk di sini untuk instalasi di platform Anda.
Catatan: Saya baru-baru ini menemukan bahwa ketika menginstal web3 dengan npm, versi 1.0.0 beta diinstal, di mana perintah yang digunakan sebelumnya (berdasarkan 0.20.4) tidak berfungsi. Karena itu, kami malah menentukan versi web3.
Semua perintah di bawah ini dalam versi 0.20.0.
Buka terminal dan bagi layar menjadi dua. Sisi kiri adalah konsol simpul, di mana kita akan bekerja sebagian besar waktu kita. Sisi kanan adalah tempat kami menjalankan TestRPC.
Mulai TestRPC
Di sisi kanan, mulai TestRPC
Di sini kita memiliki beberapa pengamatan
- TestRPC adalah aplikasi simpul yang mensimulasikan blockchain Ethereum dalam memori.
- 10 akun sudah ditentukan sebelumnya.
- Akun-akun ini dihasilkan melalui mnemonik, dan berbeda setiap kali ketika TestRPC dimulai. Untuk menjaga set akun yang sama, kita bisa menggunakan mnemonic yang ditunjukkan di atas sebagai parameter saat menjalankan TestRPC.
- Juga, RPC dibuka di localhost: 8545. Web3 mengakses blockchain melalui ini.
Kami tidak akan menyentuh bagian ini lagi, dengan asumsi semuanya bekerja dengan baik di blockchain Ethereum ini. Sekarang kita lebih fokus pada konsol node (sisi kiri). Selama pengujian, kami terus melihat perintah dan log yang dikeluarkan ke blockchain yang ditampilkan di sisi TestRPC.
Objek Web3
Kita perlu menginstruksikan konsol node yang kita gunakan web3 dan menunjuk webchain blockchain sedang berinteraksi.
tepatnya akun yang dibuat di TestRPC.
Fungsi Praktis Menampilkan Saldo
Saya telah menemukan fungsi praktis ( tautan ) yang dapat menunjukkan saldo untuk semua akun. Inilah fungsinya.
Cukup salin-rekatkan fungsi ini ke konsol simpul. Sekarang kita dapat memanggil fungsi checkAllBalances () kapan saja, dan itu akan menampilkan saldo semua akun di ether. Perhatikan bahwa fungsi ini akan hilang setelah kita keluar dari konsol node, tetapi kita dapat menambahkannya kembali kapan saja diperlukan.
Menyebarkan Kontrak
1. Menyusun Kontrak
Sekarang semuanya sudah siap. Kami dapat menggunakan kontrak Berbagi Pendapatan kami.
Kita perlu membuka kembali Remix karena kita meningkatkan kompilator pada Remix. Setelah kami menempelkan kode kontrak di Remix, kode itu dikompilasi secara otomatis. Di sini kita menggunakan hasil penyebaran kontrak.
Klik Detail pada Tag Kompilasi, dan ada banyak informasi di sana.
Di antara informasi, tiga adalah minat kami: bytecode, ABI dan Web3Deploy
Bytecode adalah versi biner dari kontrak kami setelah kompilasi dan instruksi ditetapkan untuk dijalankan di Ethereum Virtual Machine (EVM), dan ABI (aplikasi binary interface) adalah antarmuka yang kami berinteraksi dengan bytecode kontrak.
Remix cukup baik untuk menyiapkan kode di Web3Deploy, di mana bytecode dan ABI sudah termasuk dalam perintah. Karena itu kita hanya perlu menggunakan bagian Web3Deploy.
2. Menyebarkan Kontrak
Pertama, seperti yang disyaratkan oleh kontrak, kita perlu mendefinisikan daftar akun target. Untuk tujuan demo, tiga akun mulai dari akun kedua digunakan, yaitu, dari eth.accounts [1] hingga eth.accounts [3].
Kemudian kami mengikuti apa yang disarankan Web3Deploy.
Buat kelas untuk kontrak bagi hasil berdasarkan ABI. Cukup salin baris itu dari Web3Deploy.
konsol konsol > var revenuesharingContract = web3 . et . kontrak ([{ "konstan" : true, "input" : [], "name" : "creator" , "output" : [{ "name" : "" , "type" : "address" }], "dibayarkan " : false, " stateMutability " : " view " , " type " : " function " }, { " constant " : false, ""output" : [], "hutang" : false, "stateMutability" : "tidak dapat dibayar" , "type" : "function" }, { "constant" : true, "input" : [], "name" : "numShareholder " , " output " : [{ " name " : " " , " ketik " : " uint256 " }], " hutang " : false, " stateMutability " : " view " , " type " :"function" }, { "constant" : true, "input" : [{ "name": "" , "ketik" : "uint256" }], "nama" : "pemegang saham" , "output" : [{ "name" : "" , "type" : "address" }], "hutang" : false , "stateMutability" : "view" , "type" : "function" }, { "constant" : false, "input" : [], "name" : "shareRevenue" , "keluaran " : [{ " nama " : " sukses " , " ketik " :"bool" }], "hutang" : true, "stateMutability" : "hutang" , "ketik" : "fungsi" }, { "input" : [{ "name" : "address" , "type" : "address [] " }], " hutang " : false, " stateMutability " : " tidak dapat dibayar " , " ketik " : " konstruktor " }, { " anonim " : false, " input " : [{ " diindeks ": false, "name" : "_amount" , "ketik" : "uint256"}, { "indexed" : false, "name" : "_numShareholder" , "ketik" : "uint256" }], "name" : "Disburse" , "type" : "event" }]);
Sekarang gunakan kontrak dengan bytecode, ditambah informasi yang diperlukan. Sekali lagi, kita dapat menyalin baris itu dari Web3Deploy. Kontrak yang dikerahkan adalah objek yang disebut revenuesharing.
konsol konsol > var revenuesharing = revenuesharingContract . baru( alamat, { dari: web3 . et . akun [ 0 ], data:'0x6060604052341561000f57600080fd5b60405161049d38038061049d833981016040528080518201919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508151600281905550600090505b81518110156100f957818181518110151561009157fe5b906020019060200201516001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808060010191505061007a565b50506103938061010a6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302d05d3f1461007257806341c0e1b5146100c757806368eca613146100dc578063ab377daa14610105578063e579a0bd14610168575b600080fd5b341561007d57600080fd5b61008561018a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d257600080fd5b6100da6101af565b005b34156100e757600080fd5b6100ef610240565b6040518082815260200191505060405180910390f35b341561011057600080fd5b6101266004808035906020019091905050610246565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610170610279565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561023e576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b60025481565b60016020528060005260', gas: '4700000' }, fungsi (e, kontrak) { konsol . log (e, kontrak); if (typeof contract . address ! == 'undefined' ) { konsol . log ( 'Kontrak yang ditambang! Alamat:' + kontrak . alamat + 'transactionHash:' + kontrak . transactionHash); } })
Kita akan melihat (segera) bahwa kontrak ditambang.
Sekarang kita dapat menggunakan objek revenuesharing untuk berinteraksi dengan kontrak yang digunakan ini.
Berinteraksi dengan Kontrak yang Ditempatkan
Kontrak yang digunakan diakses melalui objek revenuesharing.
1. Periksa variabel publik
Kita dapat memeriksa variabel-variabel yang ditandai sebagai “publik”.
2. Jalankan fungsi shareRevenue ()
Sebelum kita menjalankan fungsi shareRevenue (), mari kita lihat saldo.
Perhatikan bahwa beberapa jumlah dikurangkan dalam akun [0], yang telah menggunakan kontrak. Jumlah eter yang dibayarkan untuk penyebaran adalah 417.626 weis. Anda dapat memeriksa apakah itu biaya transaksi yang tepat ketika kami melakukan ini di Remix.
Sekarang kita jalankan fungsinya.
konsol konsol > revenuesharing . shareRevenue ({from: web3 . eth . accounts [ 0 ], nilai: web3 . toWei ( 30 ), gas: 4700000 });
Di sini kita memanggil fungsi shareRevenue (), dan menetapkan bahwa itu dijalankan oleh akun [0], dengan 30 eter (toWei adalah fungsi di web3 digunakan untuk mengonversi 30 eter menjadi wei, karena wei adalah unit yang diterima dalam perintah ). Kami juga menaruh gas yang kami ijinkan untuk dibelanjakan (Ini jauh lebih dari yang dibutuhkan tetapi kami akan mendapatkan pengembalian dana setelah eksekusi).
Setelah transaksi dieksekusi, kita dapat memeriksa saldo kembali.
Kami telah mencapai apa yang kami inginkan: 30 eter dikurangkan dari akun [0] dan didistribusikan di antara akun [1] ke akun [3] (sekarang masing-masing memiliki 110 eter). Selain itu, sejumlah uang dibayarkan untuk melakukan transaksi ini. Ini adalah 47.776 weis, sekali lagi, cocok dengan apa yang kami amati dalam Remix.
Ringkasan
Kami telah berhasil melakukan hal yang sama pada TestRPC. Aliran keseluruhan hampir sama dengan yang ada di Remix, kecuali bahwa kita harus bekerja pada konsol node dan web3 untuk berinteraksi dengan blockchain di TestRPC. Lain kali kita akan melakukan hal yang hampir sama pada blockchain Ethereum pribadi.
source :
https://blockgeeks.com/guides/smart-contract-development/