Tutorial de coleta NFT em marmelada

Jan 25 2023
As políticas de token Marmalade permitem uma personalização refinada de como os NFTs são cunhados e vendidos. Este artigo fornece um tutorial que demonstra como uma coleção NFT compatível com pré-venda pode ser implementada em seu mercado NFT, usando um exemplo de política 'simples-one-off-collection-policy'.

As políticas de token Marmalade permitem uma personalização refinada de como os NFTs são cunhados e vendidos. Este artigo fornece um tutorial que demonstra como uma coleção NFT compatível com pré-venda pode ser implementada em seu mercado NFT, usando um exemplo de política 'simples-one-off-collection-policy'.

Este tutorial demonstrará a política passo a passo com uma coleção de exemplo chamada muppets-v1.

A liberação da coleção é realizada nas seguintes etapas:

  1. Iniciar coleta (operador)
  2. Lista de permissões de reserva (Minter)
  3. Revelar tokens na coleção (operador)
  4. Criar / Mint Token (Minter)
  5. Transferir

Para criar uma coleção, o operador executa uma função diretamente na política, marmalade.simple-1-off-whitelist-collection-policy.init-collection, com os campos obrigatórios.

  • collection-id: ID da coleção.
  • collection-size: Número total de tokens na coleção.
  • collection-hash: Hash da lista de IDs de token na coleção.
  • operator-guard: Guarda que é usado para revelar os tokens.
  • operator: conta fungível existente para receber fundos em mint.
  • fungible: o fungível a ser pago em reserve_whitelist.
  • price: o preço fungível da lista branca a ser transferido do comprador para o operador.

Quando init-collectionfor bem-sucedido, um evento (marmalade.simple-one-off-collection-policy.INIT_COLLECTION collection-id collection-size collection-hash fungible price operator)será emitido.

Iniciarmuppets-v1

  1. Crie um manifesto de token para cada token:

{
  uri:object{mf-uri}
  hash:string
  data:[object{mf-datum}]
}

2. Use marmalade.ledger.create-token-idpara gerar IDs de token.

(marmalade.ledger.create-token-id (kip.token-manifest.create-manifest (uri "text" "Kermit the Frog") [])))

Faremos o mesmo para os 7 tokens a mais e obteremos a lista de IDs de token.

(let*
  ( (get-manifest (lambda (muppet:string)
      (create-manifest (uri "text" muppet) [])
      ))
    (manifests:list (map get-manifest [ "Kermit the Frog"
                                        "Miss Piggy"
                                        "Fozzie Bear"
                                        "Gonzo"
                                        "Rowlf the Dog"
                                        "Scooter"
                                        "Animal"
                                        "Pepe the King Prawn"
                                        "Rizzo the Rat"]))
    (tokens:list (map (create-token-id) manifests)
    ))
   tokens
)

[ "t:33vh4wJvxEkXW72Bgvd88S6HKcyxLj2WJZEydAP4CCU"
   "t:UohIzpKOlpp5l7UZ-KNni2xaLu5pO67QlHLmxj65g5U"
   "t:u7u36BxiPTKp5Wuq_mXOLS7r2LFRaLeEKg2FY6ylNX0"
   "t:rj3gbsmUdcXeb0kA39meDeKoMhWOPK6XEOCQ2RKF0q8"
   "t:uOCqa9-MgFF68zyxccZKORGDk2zMRLwpKdXvr8hfE5A"
   "t:dOFBE3GdsL-5BgMCdZfQzT20G81cANzwgwIf22N8_ig"
   "t:LScEFcxVDsvZP38jO1Kp95yNu7hGmGNrzYkwCM5UWyA"
   "t:--kKualbcNt2jKUPLG0Pyp6ByLJerOS_Wtxe914_YHA"
   "t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4"]

Por fim, podemos fazer o hash da lista e obter o collection-hash, usando hasha função.

(hash
  ["t:33vh4wJvxEkXW72Bgvd88S6HKcyxLj2WJZEydAP4CCU"
   "t:UohIzpKOlpp5l7UZ-KNni2xaLu5pO67QlHLmxj65g5U"
   "t:u7u36BxiPTKp5Wuq_mXOLS7r2LFRaLeEKg2FY6ylNX0"
   "t:rj3gbsmUdcXeb0kA39meDeKoMhWOPK6XEOCQ2RKF0q8"
   "t:uOCqa9-MgFF68zyxccZKORGDk2zMRLwpKdXvr8hfE5A"
   "t:dOFBE3GdsL-5BgMCdZfQzT20G81cANzwgwIf22N8_ig"
   "t:LScEFcxVDsvZP38jO1Kp95yNu7hGmGNrzYkwCM5UWyA"
   "t:--kKualbcNt2jKUPLG0Pyp6ByLJerOS_Wtxe914_YHA"
   "t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4"] )

4. Executarinit-collection

Finalmente, temos nossos campos obrigatórios para iniciar nossa coleta. O código a seguir cria muppet-v1uma coleção com 9 tokens que geramos acima, sendo k:aa5f18ed095607fbef309abd5511baaa0844e067a61ed4cf51d5333e770ed030a conta do operador fungível, coin, com preço whitelist de 5,0. Este código agora deve ser enviado para a cadeia.

(init-collection
  "muppet-v1" 9 "eLbTngl8lNBPshPMohX0ILM8l7R4RV8eNm9p0Pq1W6E"
  "k:aa5f18ed095607fbef309abd5511baaa0844e067a61ed4cf51d5333e770ed030" (read-keyset 'operator-guard) coin 5.0)

Lista de permissões de reserva

As listas brancas nesta política de coleta são por ordem de chegada. Esta etapa deve ser executada pelos cunhadores.

  1. Para reservar whitelists, os mineradores devem ter uma fungibleconta com saldo maior que o preço.

(create-principal (read-keyset 'keyset))

{
  "keys": ["27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4"],
  "pred": "keys-all"
}

Como esta transação será transferida coinpara o operador, os cunhadores devem assinar a capacidade (coin.TRANSFER "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4" "k:aa5f18ed095607fbef309abd5511baaa0844e067a61ed4cf51d5333e770ed030" 5.0)de enviar da conta da casa da moeda para a conta do operador.

2. Com a conta preparada, os mineradores agora podem executar reserve-whiteliste obter seus slots bloqueados.

A lista de permissões bem-sucedida emitirá um evento, (RESERVE_WHITELIST collection-id account whitelist-index). Esta informação deve ser salva para as criações de token e índice mint.

A lista de permissões do último token gerará um índice aleatório que deslocará os slots da lista de permissões. Este índice de deslocamento será usado para randomizar a seleção de NFTs dentro da coleção. Ao definir aleatoriamente o índice de turno no final da lista branca, a marmelada evita que o operador reserve determinados NFTs que podem ser mais valiosos do que outros.

Colocar um token na lista de permissõesmuppet-v1

  1. Execute reserve-whitelistcom um conjunto de chaves.
  2. (marmalade.simple-one-off-collection-policy.reserve-whitelist "muppet-v1" (create-principal (read-keyset 'keyset)))
    

    (marmalade.simple-one-off-collection-policy.RESERVE_WHITELIST "muppets-v1" "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4" 0)
    

(marmalade.simple-one-off-collection-policy.RESERVE_WHITELIST "muppets-v1" "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4" 8)
(marmalade.simple-one-off-collection-policy.SHIFT collection-0" 8)

Depois reserve-whitelistde concluído, o operador pode agora revelar os manifestos de token, mostrando qual índice de lista branca é dedicado a cada id de token.

Revelarmuppets-v1

O operador do muppets-v1irá preparar os token-ids e executar a função.

(marmalade.simple-one-off-collection-policy.reveal-tokens "muppets-v1"
    [  "t:33vh4wJvxEkXW72Bgvd88S6HKcyxLj2WJZEydAP4CCU"
       "t:UohIzpKOlpp5l7UZ-KNni2xaLu5pO67QlHLmxj65g5U"
       "t:u7u36BxiPTKp5Wuq_mXOLS7r2LFRaLeEKg2FY6ylNX0"
       "t:rj3gbsmUdcXeb0kA39meDeKoMhWOPK6XEOCQ2RKF0q8"
       "t:uOCqa9-MgFF68zyxccZKORGDk2zMRLwpKdXvr8hfE5A"
       "t:dOFBE3GdsL-5BgMCdZfQzT20G81cANzwgwIf22N8_ig"
       "t:LScEFcxVDsvZP38jO1Kp95yNu7hGmGNrzYkwCM5UWyA"
       "t:--kKualbcNt2jKUPLG0Pyp6ByLJerOS_Wtxe914_YHA"
       "t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4"])

(enforce (= collection-hash (hash token-ids)) "Token manifests don't match")

Criar Token / Cunhar Token

create-tokené uma operação necessária para cada token de marmelada na coleção para adicioná-lo ao registro de marmelada. Minters devem usar o manifesto publicado para chamar create-token.

Esta etapa é idealmente executada junto com minta transação. minté a etapa final necessária para possuir o token. Semelhante a create-token, minté uma operação geral de marmelada.

A política de coleta impõe que o create-tokene mintseja feito pela conta da lista de permissões.

Crie o token “t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4”.

  1. Encontre o arquivo whitelist-info.

(marmalade.simple-one-off-collection-policy.RESERVE_WHITELIST "muppets-v1" "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4" 0)

Nosso whitelist-infoserá adicionado à env-datanossa transação e terá a seguinte aparência:

{
  'whitelist-info : {
     'collection-id: "muppets-v1"
    ,"index": 0
    ,"account": "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4"
    ,"guard": {"keys": ["27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4"], "pred": "keys-all"}}
}

Nosso índice de lista de desbloqueio era 0. Quando a lista de desbloqueio terminou, o índice de turno foi atualizado em 8. Isso significa que poderemos cunhar o token no índice 8. Se nosso índice de lista de desbloqueio for 1, poderemos cunhar o token no índice 0, e assim por diante. O token-id no índice 8 é t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4.

3. Receba o token-manifesto do operador.

O operador liberará o manifesto do token em algum lugar para que os usuários criem os tokens. O manifesto que corresponde ao token t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4é mostrado abaixo.

{"uri":
  {"scheme": "text","data": "Rizzo the Rat"},
   "hash": "sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4","data": []}

(kip.token-manifest.create-manifest (uri "text" "Rizzo the Rat") [])

create-tokenleva em token-id, precision, token-manifeste policy. O precisioné 0, porque esta é uma política de coleta única. mintleva em token-id, account, guarde amount. amounté sempre 1,0, porque esta é uma política de cobrança pontual.

(marmalade.ledger.create-token
  "t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4"
  0
  {"uri":
    {"scheme": "text","data": "Rizzo the Rat"},
     "hash": "sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4","data": []}
  marmalade.simple-one-off-collection-policy)
(marmalade.ledger.mint
  "t:9mCeDcVIuQET1awDEWbYXF-HlRzhLv5VW3hXiW9m678"
  "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4"
  (at 'guard (read-msg 'whitelist-info ))
  1.0))

create-tokene mintpodem ser executados separadamente ou juntos na mesma transação.

Transferir

Esta política de cobrança usa simples transfere transfer-createdo marmalade.ledgercontrato. transferrequer nomes de contas de remetentes e destinatários, bem como o valor, que funciona com contas de destinatários existentes. transfer-createrequer nomes de conta do remetente e do destinatário, proteção do destinatário e a quantia, que funciona com destinatários existentes e inexistentes. A assinatura do remetente é necessária para ambos transfere transfer-create.

Coisas a considerar

Agora, examinamos como iniciar uma coleção para cunhar cada token na coleção. A conta designada na mintetapa agora possui o token no marmaladerazão principal.

Há mais perguntas a serem feitas, no entanto, incluindo a escalabilidade de coleções maiores.

  • Como devemos evitar que o operador engane os whitelisters? O contrato coleta os fundos dos compradores na reserve-whitelistfase, o que significa que, sem que o operador forneça manifestos de token, os compradores não podem cunhar o token.
  • O operador deve executar reveal-tokens? Se a lista de tokens estiver disponível fora da cadeia, o operador não é necessariamente obrigado a reveal-tokens. Se não, quem deve administrá-lo?
  • Se a coleção contiver tokens maiores, adicionar os slots e a lista de tokens como uma lista dentro de uma tabela pode se tornar uma transação cara. A alternativa pode ser adicionar cada lista de permissões e IDs de token como linhas na tabela.