Vai al contenuto principale

Come implementare un mercato ERC-721

contratti intelligenti
erc-721
Solidity
token
Intermedio
Alberto Cuesta Cañada
19 marzo 2020
6 minuti di lettura

In questo articolo, ti mostrerò come programmare Craigslist per la blockchain di Ethereum.

Prima di Gumtree, Ebay e Craigslist, le bacheche di annunci erano per lo più fatte di sughero o carta. C'erano bacheche di annunci nei corridoi delle scuole, sui giornali, sui lampioni, nelle vetrine dei negozi.

Tutto questo è cambiato con Internet. Il numero di persone che potevano vedere una specifica bacheca di annunci si è moltiplicato di molti ordini di grandezza. Con ciò, i mercati che rappresentano sono diventati molto più efficienti e sono scalati a dimensioni globali. Ebay è un'azienda enorme che affonda le sue origini in queste bacheche di annunci fisiche.

Con la blockchain questi mercati sono destinati a cambiare ancora una volta, lascia che ti mostri come.

Monetizzazione

Il modello di business di una bacheca di annunci su una blockchain pubblica dovrà essere diverso da quello di Ebay e compagnia.

Innanzitutto, c'è l'aspetto della decentralizzazione. Le piattaforme esistenti devono mantenere i propri server. Una piattaforma decentralizzata è mantenuta dai suoi utenti, quindi il costo di gestione della piattaforma principale scende a zero per il proprietario della piattaforma.

Poi c'è il front-end, il sito web o l'interfaccia che dà accesso alla piattaforma. Qui ci sono molte opzioni. I proprietari della piattaforma possono limitare l'accesso e costringere tutti a usare la loro interfaccia, addebitando una commissione. I proprietari della piattaforma possono anche decidere di aprire l'accesso (Potere al Popolo!) e lasciare che chiunque costruisca interfacce per la piattaforma. Oppure i proprietari potrebbero decidere per un approccio a metà tra questi estremi.

I leader aziendali con più visione di me sapranno come monetizzare tutto questo. Tutto ciò che vedo è che questo è diverso dallo status quo e probabilmente redditizio.

Inoltre, c'è l'aspetto dell'automazione e dei pagamenti. Alcune cose possono essere tokenizzate in modo molto efficace (opens in a new tab) e scambiate in una bacheca di annunci. Gli asset tokenizzati sono facilmente trasferibili in una blockchain. Metodi di pagamento altamente complessi possono essere facilmente implementati in una blockchain.

Sento odore di un'opportunità di business qui. Una bacheca di annunci senza costi di gestione può essere facilmente implementata, con percorsi di pagamento complessi inclusi in ogni transazione. Sono sicuro che a qualcuno verrà in mente un'idea su come utilizzarla.

Io sono solo felice di costruirla. Diamo un'occhiata al codice.

Implementazione

Qualche tempo fa abbiamo avviato un repository open source (opens in a new tab) con implementazioni di esempi di casi aziendali e altre chicche, dacci un'occhiata.

Il codice per questa Bacheca di Annunci di Ethereum (opens in a new tab) è lì, per favore usalo e abusane. Tieni solo presente che il codice non è stato verificato e devi fare la tua due diligence prima di investirci del denaro.

Le basi della bacheca non sono complesse. Tutti gli annunci nella bacheca saranno solo una struct con alcuni campi:

1struct Trade {
2 address poster;
3 uint256 item;
4 uint256 price;
5 bytes32 status; // Aperto, Eseguito, Annullato
6}

Quindi c'è qualcuno che pubblica l'annuncio. Un oggetto in vendita. Un prezzo per l'oggetto. Lo stato dello scambio che può essere aperto, eseguito o annullato.

Tutti questi scambi saranno conservati in una mappatura. Perché tutto in Solidity sembra essere una mappatura. Anche perché è conveniente.

1mapping(uint256 => Trade) public trades;

Usare una mappatura significa solo che dobbiamo inventare un ID per ogni annuncio prima di pubblicarlo, e avremo bisogno di conoscere l'ID di un annuncio prima di potervi operare. Ci sono molti modi per affrontare questo problema sia nel contratto intelligente che nel front-end. Chiedi pure se hai bisogno di qualche dritta.

Poi sorge la domanda su quali siano quegli oggetti di cui ci occupiamo, e quale sia questa valuta utilizzata per pagare la transazione.

Per gli oggetti, chiederemo semplicemente che implementino l'interfaccia ERC-721 (opens in a new tab), che in realtà è solo un modo per rappresentare oggetti del mondo reale in una blockchain, sebbene funzioni meglio con gli asset digitali (opens in a new tab). Specificheremo il nostro contratto ERC721 nel costruttore, il che significa che qualsiasi asset nella nostra bacheca di annunci deve essere stato tokenizzato in precedenza.

Per i pagamenti, faremo qualcosa di simile. La maggior parte dei progetti blockchain definisce la propria criptovaluta ERC-20 (opens in a new tab). Altri preferiscono usarne una tradizionale come DAI. In questa bacheca di annunci, devi solo decidere al momento della costruzione quale sarà la tua valuta. Facile.

1constructor (
2 address _currencyTokenAddress, address _itemTokenAddress
3) public {
4 currencyToken = IERC20(_currencyTokenAddress);
5 itemToken = IERC721(_itemTokenAddress);
6 tradeCounter = 0;
7}

Ci stiamo arrivando. Abbiamo annunci, oggetti da scambiare e una valuta per i pagamenti. Creare un annuncio significa mettere un oggetto in garanzia (escrow) per dimostrare sia che lo possiedi sia che non lo hai pubblicato due volte, possibilmente in una bacheca diversa.

Il codice qui sotto fa esattamente questo. Mette l'oggetto in garanzia, crea l'annuncio, fa un po' di pulizia.

1function openTrade(uint256 _item, uint256 _price)
2 public
3{
4 itemToken.transferFrom(msg.sender, address(this), _item);
5 trades[tradeCounter] = Trade({
6 poster: msg.sender,
7 item: _item,
8 price: _price,
9 status: "Open"
10 });
11 tradeCounter += 1;
12 emit TradeStatusChange(tradeCounter - 1, "Open");
13}
Mostra tutto

Accettare lo scambio significa scegliere un annuncio (scambio), pagare il prezzo, ricevere l'oggetto. Il codice qui sotto recupera uno scambio. Controlla che sia disponibile. Paga l'oggetto. Recupera l'oggetto. Aggiorna l'annuncio.

1function executeTrade(uint256 _trade)
2 public
3{
4 Trade memory trade = trades[_trade];
5 require(trade.status == "Open", "Trade is not Open.");
6 currencyToken.transferFrom(msg.sender, trade.poster, trade.price);
7 itemToken.transferFrom(address(this), msg.sender, trade.item);
8 trades[_trade].status = "Executed";
9 emit TradeStatusChange(_trade, "Executed");
10}
Mostra tutto

Infine, abbiamo un'opzione per i venditori di ritirarsi da uno scambio prima che un acquirente lo accetti. In alcuni modelli, gli annunci rimarrebbero invece attivi per un periodo di tempo prima di scadere. A te la scelta, a seconda del design del tuo mercato.

Il codice è molto simile a quello utilizzato per eseguire uno scambio, solo che non c'è alcun passaggio di valuta e l'oggetto torna a chi ha pubblicato l'annuncio.

1function cancelTrade(uint256 _trade)
2 public
3{
4 Trade memory trade = trades[_trade];
5 require(
6 msg.sender == trade.poster,
7 "Trade can be cancelled only by poster."
8 );
9 require(trade.status == "Open", "Trade is not Open.");
10 itemToken.transferFrom(address(this), trade.poster, trade.item);
11 trades[_trade].status = "Cancelled";
12 emit TradeStatusChange(_trade, "Cancelled");
13}
Mostra tutto

Questo è tutto. Sei arrivato alla fine dell'implementazione. È abbastanza sorprendente quanto siano compatti alcuni concetti aziendali quando espressi in codice, e questo è uno di quei casi. Controlla il contratto completo nel nostro repo (opens in a new tab).

Conclusione

Le bacheche di annunci sono una configurazione di mercato comune che è scalata massicciamente con Internet, diventando un modello di business estremamente popolare con pochi vincitori monopolistici.

Le bacheche di annunci si rivelano anche uno strumento facile da replicare in un ambiente blockchain, con caratteristiche molto specifiche che renderanno possibile una sfida ai giganti esistenti.

In questo articolo, ho fatto un tentativo di collegare la realtà aziendale di un business di bacheche di annunci con l'implementazione tecnologica. Questa conoscenza dovrebbe aiutarti a creare una visione e un piano d'azione per l'implementazione se hai le giuste competenze.

Come sempre, se hai intenzione di costruire qualcosa di divertente e gradiresti qualche consiglio, per favore scrivimi (opens in a new tab)! Sono sempre felice di aiutare.

Ultimo aggiornamento della pagina: 15 agosto 2023

Questo tutorial è stato utile?