Tutorial de la colección NFT en Marmalade

Jan 25 2023
Las políticas de tokens de Marmalade permiten una personalización detallada de cómo se acuñan y venden los NFT. Este artículo proporciona un tutorial que demuestra cómo se podría implementar una colección de NFT compatible con la preventa en su mercado de NFT, utilizando una política de ejemplo 'política de colección única y simple'.

Las políticas de tokens de Marmalade permiten una personalización detallada de cómo se acuñan y venden los NFT. Este artículo proporciona un tutorial que demuestra cómo se podría implementar una colección de NFT compatible con la preventa en su mercado de NFT, utilizando una política de ejemplo 'política de colección única y simple'.

Este tutorial demostrará la política paso a paso con una colección de ejemplo llamada muppets-v1.

La liberación de la colección se logra en los siguientes pasos:

  1. Iniciar colección (Operador)
  2. Reservar lista blanca (Minter)
  3. Revelar tokens en colección (Operador)
  4. Crear / Mint Token (Minter)
  5. Transferir

Para crear una colección, el operador ejecuta una función directamente en la póliza, marmalade.simple-1-off-whitelist-collection-policy.init-collectioncon los campos requeridos.

  • collection-id: id de la colección.
  • collection-size: Número total de tokens en la colección.
  • collection-hash: Hash de la lista de identificadores de token en la colección.
  • operator-guard: Guardia que se utiliza para revelar las fichas.
  • operator: cuenta fungible existente para recibir fondos en mint.
  • fungible: el fungible a pagar en reserve_whitelist.
  • price: el precio fungible de la lista blanca a transferir del comprador al operador.

Cuando tenga éxito, se emitirá init-collectionun evento .(marmalade.simple-one-off-collection-policy.INIT_COLLECTION collection-id collection-size collection-hash fungible price operator)

Iniciadomuppets-v1

  1. Cree un manifiesto de token para cada token:

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

2. Úselo marmalade.ledger.create-token-idpara generar identificadores de token.

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

Haremos lo mismo con los 7 tokens más y obtendremos la lista de identificadores 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"]

Finalmente, podemos hacer hash de la lista y obtener el collection-hash, usando hashla función.

(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. Correinit-collection

Finalmente, tenemos nuestros campos requeridos para iniciar nuestra colección. El siguiente código crea muppet-v1una colección con 9 tokens que generamos anteriormente, siendo k:aa5f18ed095607fbef309abd5511baaa0844e067a61ed4cf51d5333e770ed030la cuenta del operador fungible, coincon un precio de lista blanca de 5.0. Este código ahora debe enviarse a la cadena.

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

Reservar lista blanca

Las listas blancas en esta política de recopilación se asignan por orden de llegada. Este paso debe ser ejecutado por los minters.

  1. Para reservar listas blancas, los minters deben tener una fungiblecuenta con un saldo mayor que el precio.

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

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

Debido a que esta transacción se transferirá coinal operador, los minters deben firmar la capacidad (coin.TRANSFER "k:27fff7d20390142caf727cd4713d2c810839486fa2350af7e2ce980090185ce4" "k:aa5f18ed095607fbef309abd5511baaa0844e067a61ed4cf51d5333e770ed030" 5.0)de enviar desde la cuenta mint a la cuenta del operador.

2. Con la cuenta preparada, los minters ahora pueden ejecutar reserve-whitelisty bloquear sus espacios.

La lista blanca exitosa emitirá un evento, (RESERVE_WHITELIST collection-id account whitelist-index). Esta información debe guardarse para las creaciones de fichas y el índice de menta.

La lista blanca del último token generará un índice aleatorio que cambiará las ranuras de la lista blanca. Este índice de cambio se utilizará para aleatorizar la selección de NFT dentro de la colección. Al establecer aleatoriamente el índice de cambio al final de la lista blanca, mermelada evita que el operador reserve ciertos NFT que pueden ser más valiosos que otros.

Lista blanca de un token enmuppet-v1

  1. Ejecutar reserve-whitelistcon un conjunto de teclas.
  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)

Una vez que reserve-whitelistse completa, el operador ahora puede revelar los manifiestos del token, mostrando qué índice de la lista blanca está dedicado a cada ID de token.

Revelarmuppets-v1

El operador de muppets-v1preparará los token-ids y ejecutará la función.

(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")

Crear token / token de menta

create-tokenes una operación requerida para cada ficha de mermelada en la colección para agregarla al libro mayor de mermelada. Minters debe utilizar el manifiesto publicado para llamar create-token.

Idealmente, este paso se ejecuta junto con mintla transacción. mintes el paso final que se requiere para poseer el token. Similar a create-token, mintes una operación general de mermelada.

La política de cobro exige que el create-tokeny mintlo realice la cuenta incluida en la lista blanca.

Cree el token "t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4".

  1. Encuentra el whitelist-info.

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

Nuestro whitelist-infose agregará a env-datanuestra transacción y se verá así:

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

Nuestro índice de lista blanca era 0. Cuando finalizó la lista blanca, el índice de cambio se actualizó a 8. Esto significa que podremos acuñar el token en el índice 8. Si nuestro índice de lista blanca era 1, podremos acuñar el token en el índice 0, y así sucesivamente. El token-id en el índice 8 es t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4.

3. Reciba el token-manifiesto del operador.

El operador lanzará el token-manifest en algún lugar para que los usuarios acumulen los tokens. El manifiesto que coincide con el token t:sQ19jh3-w3HOchpBefpKTBGj2_ARjC4xLiV0SVlokf4se muestra a continuación.

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

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

create-tokentoma en token-id, precision, token-manifesty policy. El valor precisiones 0, porque se trata de una política de cobro única. minttoma en token-id, account, guardy amount. amountes siempre 1.0, porque se trata de una política de cobro única.

(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-tokeny mintpueden ejecutarse por separado o juntos en la misma transacción.

Transferir

Esta política de cobro se utiliza a simple vista transfery transfer-createdesde el marmalade.ledgercontrato. transferrequiere los nombres de las cuentas del remitente y del destinatario, así como la cantidad, que funciona con cuentas de destinatarios existentes. transfer-createrequiere los nombres de cuenta del remitente y el destinatario, la protección del destinatario y el monto, que funciona con destinatarios existentes e inexistentes. Se requiere la firma del remitente para ambos transfery transfer-create.

Cosas para considerar

Ahora hemos analizado cómo iniciar una colección para acuñar cada ficha de la colección. La cuenta designada en el mintpaso ahora posee el token en el marmaladelibro mayor principal.

Sin embargo, hay más preguntas que hacer, incluida la escalabilidad de colecciones más grandes.

  • ¿Cómo debemos evitar que el operador estafe a los whitelisters? El contrato recauda los fondos de los compradores en la reserve-whitelistfase, lo que significa que sin que el operador proporcione muestras de token, los compradores no pueden acuñar el token.
  • ¿ Debe correr el operador reveal-tokens? Si la lista de tokens está disponible fuera de la cadena, entonces el operador no está necesariamente obligado a hacerlo reveal-tokens. Si no, ¿quién debería ejecutarlo?
  • Si la colección contiene tokens más grandes, agregar las ranuras y la lista de tokens como una lista dentro de una tabla puede convertirse en una transacción costosa. La alternativa puede ser agregar cada lista blanca e identificación de token como filas en la tabla.