Kami sekarang akan mengubah kontrak Item
sederhana menjadi kontrak Marketplace
yang lebih kompleks. Kontrak Marketplace
akan menyimpan daftar barang yang dijual, menyediakan cara bagi pengguna untuk membuat daftar barang baru untuk dijual, dan menyediakan cara bagi pengguna untuk membeli barang.
Untuk melakukan ini, kami akan menambahkan beberapa fitur baru ke kontrak kami:
Setiap barang kini akan memiliki alamat seller
, yang mewakili pemilik barang tersebut.
Kami akan memperkenalkan fungsi baru listItemForSale
yang memungkinkan pengguna membuat daftar item baru untuk dijual.
Kami akan memperkenalkan fungsi buyItem
baru yang memungkinkan pengguna membeli suatu item.
Marketplace
:Soliditas
// Pengenal Lisensi SPDX: soliditas pragma MIT
^0.8.6;
contract Marketplace {
// Tentukan struktur baru untuk Item
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Array untuk menampung semua item
Item[] item publik;
// Event yang akan dikeluarkan ketika item baru dibuat
event NewItem(uint itemId, string itemName, uint itemPrice, alamat penjual);
// Event yang akan dikeluarkan saat item terdaftar untuk dijual
event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);
// Event yang akan dikeluarkan saat item dibeli
event ItemBought(uint itemId, string itemName, uint itemPrice, alamat penjual, alamat pembeli);
// Berfungsi untuk membuat item baru namun tidak langsung mencantumkannya untuk dijual
fungsi createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Berfungsi untuk membuat daftar item untuk dijual
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Fungsi untuk membeli suatu barang
fungsi buyItem(uint _itemId) hutang publik {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Struktur Item
yang sekarang menyertakan alamat seller
dan boolean forSale
. seller
adalah pemilik barang tersebut, dan forSale
menunjukkan apakah barang tersebut saat ini terdaftar untuk dijual.
Fungsi createItem
yang membuat item baru dan menetapkan msg.sender
sebagai penjual. msg.sender
adalah variabel global dalam Solidity yang mewakili alamat orang (atau kontrak pintar) yang disebut fungsi saat ini. Namun, barang tersebut tidak langsung terdaftar untuk dijual.
Fungsi listItemForSale
yang memungkinkan penjual suatu item mencantumkannya untuk dijual. Kami menggunakan fungsi require
untuk memastikan bahwa hanya penjual yang dapat mencantumkan barang yang akan dijual.
Fungsi buyItem
yang memungkinkan seseorang membeli suatu item. Fungsinya memeriksa apakah barang tersebut untuk dijual, pembeli bukan penjual, dan harga yang dikirim benar. Jika kondisi ini terpenuhi, fungsi akan mengirimkan uang ke penjual dan menandai barang tersebut sebagai tidak untuk dijual.
Setelah menulis kontrak Marketplace
, langkah selanjutnya adalah mengkompilasi dan menerapkannya. Anda dapat menggunakan plugin Solidity Compiler di Remix untuk mengkompilasi kontrak, seperti yang kita lakukan di Pelajaran 1.
Untuk menerapkan kontrak, buka plugin Deploy & Run Transactions (yang memiliki ikon kubus) di panel kanan. Pilih lingkungan yang sesuai (JavaScript VM untuk simulasi), pilih kontrak Marketplace
dari dropdown Kontrak, dan klik tombol Deploy.
Setelah kontrak diterapkan, kontrak tersebut akan muncul di bagian Kontrak yang Dikerahkan. Anda dapat memperluasnya untuk melihat variabel dan fungsi status publiknya. Anda dapat membuat, membuat daftar, dan membeli item dengan memanggil fungsi-fungsi ini.
Untuk membuat item, masukkan nama dan harga, lalu klik tombol createItem
. Untuk mencantumkan item yang akan dijual, masukkan ID item dan klik tombol listItemForSale
. Untuk membeli item, masukkan ID item, kirimkan jumlah Ether yang benar, dan klik tombol buyItem
.
Selamat! Anda sekarang tahu cara membuat pasar dasar terdesentralisasi di blockchain Ethereum.
Pada pelajaran berikutnya, kita akan meningkatkan pasar kita dengan menambahkan fungsi untuk menghapus barang dari penjualan dan memperbarui harga suatu barang. Pantau terus!
Kami sekarang akan mengubah kontrak Item
sederhana menjadi kontrak Marketplace
yang lebih kompleks. Kontrak Marketplace
akan menyimpan daftar barang yang dijual, menyediakan cara bagi pengguna untuk membuat daftar barang baru untuk dijual, dan menyediakan cara bagi pengguna untuk membeli barang.
Untuk melakukan ini, kami akan menambahkan beberapa fitur baru ke kontrak kami:
Setiap barang kini akan memiliki alamat seller
, yang mewakili pemilik barang tersebut.
Kami akan memperkenalkan fungsi baru listItemForSale
yang memungkinkan pengguna membuat daftar item baru untuk dijual.
Kami akan memperkenalkan fungsi buyItem
baru yang memungkinkan pengguna membeli suatu item.
Marketplace
:Soliditas
// Pengenal Lisensi SPDX: soliditas pragma MIT
^0.8.6;
contract Marketplace {
// Tentukan struktur baru untuk Item
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Array untuk menampung semua item
Item[] item publik;
// Event yang akan dikeluarkan ketika item baru dibuat
event NewItem(uint itemId, string itemName, uint itemPrice, alamat penjual);
// Event yang akan dikeluarkan saat item terdaftar untuk dijual
event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);
// Event yang akan dikeluarkan saat item dibeli
event ItemBought(uint itemId, string itemName, uint itemPrice, alamat penjual, alamat pembeli);
// Berfungsi untuk membuat item baru namun tidak langsung mencantumkannya untuk dijual
fungsi createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Berfungsi untuk membuat daftar item untuk dijual
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Fungsi untuk membeli suatu barang
fungsi buyItem(uint _itemId) hutang publik {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Struktur Item
yang sekarang menyertakan alamat seller
dan boolean forSale
. seller
adalah pemilik barang tersebut, dan forSale
menunjukkan apakah barang tersebut saat ini terdaftar untuk dijual.
Fungsi createItem
yang membuat item baru dan menetapkan msg.sender
sebagai penjual. msg.sender
adalah variabel global dalam Solidity yang mewakili alamat orang (atau kontrak pintar) yang disebut fungsi saat ini. Namun, barang tersebut tidak langsung terdaftar untuk dijual.
Fungsi listItemForSale
yang memungkinkan penjual suatu item mencantumkannya untuk dijual. Kami menggunakan fungsi require
untuk memastikan bahwa hanya penjual yang dapat mencantumkan barang yang akan dijual.
Fungsi buyItem
yang memungkinkan seseorang membeli suatu item. Fungsinya memeriksa apakah barang tersebut untuk dijual, pembeli bukan penjual, dan harga yang dikirim benar. Jika kondisi ini terpenuhi, fungsi akan mengirimkan uang ke penjual dan menandai barang tersebut sebagai tidak untuk dijual.
Setelah menulis kontrak Marketplace
, langkah selanjutnya adalah mengkompilasi dan menerapkannya. Anda dapat menggunakan plugin Solidity Compiler di Remix untuk mengkompilasi kontrak, seperti yang kita lakukan di Pelajaran 1.
Untuk menerapkan kontrak, buka plugin Deploy & Run Transactions (yang memiliki ikon kubus) di panel kanan. Pilih lingkungan yang sesuai (JavaScript VM untuk simulasi), pilih kontrak Marketplace
dari dropdown Kontrak, dan klik tombol Deploy.
Setelah kontrak diterapkan, kontrak tersebut akan muncul di bagian Kontrak yang Dikerahkan. Anda dapat memperluasnya untuk melihat variabel dan fungsi status publiknya. Anda dapat membuat, membuat daftar, dan membeli item dengan memanggil fungsi-fungsi ini.
Untuk membuat item, masukkan nama dan harga, lalu klik tombol createItem
. Untuk mencantumkan item yang akan dijual, masukkan ID item dan klik tombol listItemForSale
. Untuk membeli item, masukkan ID item, kirimkan jumlah Ether yang benar, dan klik tombol buyItem
.
Selamat! Anda sekarang tahu cara membuat pasar dasar terdesentralisasi di blockchain Ethereum.
Pada pelajaran berikutnya, kita akan meningkatkan pasar kita dengan menambahkan fungsi untuk menghapus barang dari penjualan dan memperbarui harga suatu barang. Pantau terus!