Los estándares de token de Qtum Parte 1: QRC20 y QRC721

Qtum Español
7 min readSep 26, 2021

La creación de un estándar de token único para todos fue crucial para la adopción generalizada de Ethereum. Los estándares de token más populares para Ethereum son ERC20, ERC721 y ERC1155. Entonces, hoy en esta primera parte, veamos QRC20 y QRC721 (junto con sus contrapartes Ethereum). Luego, en la segunda parte, aprenderemos más sobre QRC1155.

¿Por qué Ethereum necesitaba un token estándar?

Hagamos un experimento mental rápido. Imagina que vives en el país A. Hay un carril en ese país con 5 tiendas diferentes que aceptan 5 monedas diferentes. ¿Te imaginas lo confuso y caótico que podría ser? Sin tener una moneda establecida que sea aceptada en todas partes, la economía local de A probablemente se derrumbará. Ahora, extendamos esta lógica a Ethereum.

Cada aplicación que se ejecutaba sobre Ethereum tenía su propia estructura de token y token en el pasado. Sin embargo, la comunidad pronto se dio cuenta de que tener tantos estándares de token diferentes arruinaría la interoperabilidad del sistema. Esto dio lugar a los estándares de tokens de Ethereum.

ERC20: Estándar de token fungible

El estándar de token ERC20 se utiliza para definir tokens fungibles. La fungibilidad es una propiedad esencial para definir las monedas, ya que la fungibilidad imparte los valores de replicabilidad y rompibilidad. En 2017, durante el período de auge de ICO, el estándar ERC20 se hizo popular debido a la simplicidad de implementación.

ERC significa “Solicitud de comentario de Ethereum”, mientras que el número ‘20’ es el número asignado a esta solicitud. Los componentes básicos del estándar ERC20 son los siguientes:

  • Suministro total
  • equilibrio de
  • transferir
  • Transferido de
  • aprobar
  • prestación
  • Nombre del token: opcional
  • Símbolo — Opcional
  • Decimal (hasta 18) — Opcional

Qtum y QRC20

El estándar QRC20 es el mismo que el ERC20. Entonces, puede usar el código QRC20Token para crear su propio token QRC20 en Qtum. Si desea una guía adecuada paso a paso para desarrollar sus tokens QRC20, verifique esto.

Cuando se trata de la interacción del contrato QRC20, hay ciertas pautas a seguir.

Obtener saldo de tokens

1 — el texto de ejemplo de código se da a continuación

En el código anterior, $ userAddress es la dirección de depósito. Este código devolverá una salida JSON. En él, busque “executionResult.output”, que será el saldo del token.

Retirar

En la imagen de arriba:

  • $userAddress es la dirección de retiro
  • $monto el monto retirado en token de unidad

Este código devuelve el txid de la transacción. Puede utilizar la identificación para encontrar información sobre esta transacción.

Genere una dirección de depósito

El usuario puede usar el mismo depósito tanto para Qtum como para otros tokens QRC20. Puede usar este comando para generar una dirección de depósito:

qtum-cli getnewaddress

Registros de depósitos y retiros

Si bien puede comenzar a buscar desde 0, pero para una mejor eficiencia, debe comenzar desde $StartingBlock.

Transferencia de eventos (dirección indexada _from, dirección indexada _to, uint256 _value)

El código anterior le permite filtrar diferentes tipos de eventos. Puede mirar a través de los registros para filtrar por direcciones.

Comprobación de confirmaciones

Dado un ID de transacción $txid:

qtum-cli gettransaction $txid

Puede utilizar la propiedad “confirmaciones” en la salida.

ERC721: Estándar de token no fungible

El segundo estándar de tokens más destacado que tiene Ethereum es ERC721, que se utiliza para definir tokens no fungibles. En muchos sentidos, es bastante similar a ERC20. Ethereum hizo esto para que los desarrolladores pudieran incorporarlo fácilmente en su código. Sin embargo, lo que realmente define a las NFT son las funciones de propiedad del token.

A diferencia de los tokens ERC20, un token ERC721 es fundamentalmente diferente de otro debido a las funciones de propiedad mencionadas en el código. Las funciones de propiedad definidas en ERC721 son las siguientes:

  • propietario de()
  • aprobación()
  • tomar posesión()
  • transferir()
  • token de propietario por índice ()

Dueño de ()

Esta función devuelve la dirección del propietario del token. Esto es muy importante, ya que la propiedad es un principio fundamental de las NFT.

Aprobar ()

Otra cosa a tener en cuenta sobre las NFT es que le permite transferir la propiedad de una entidad a otra. En pocas palabras, el programa garantiza que se pueda transferir la propiedad cuando sea necesario.

Tomar posesión ()

La función takeOwnership () es como una función de “retirar”. Cualquier parte externa puede llamar a la función para sacar tokens de la cuenta de otro usuario.

Transferir ()

La función de transferencia () le permite transferir la NFT de un propietario a otro.

Token de propietario por índice () [opcional]

Esta es una función opcional. Un propietario puede poseer varios NFT a la vez. Para facilitar el seguimiento de la NFT de un titular, mantiene un registro de los ID de cada token que posee cada usuario.

Qtum y QRC721

El QRC721 de Qtum emula el estándar de token ERC721 de Ethereum.

Así es como se implementa el contrato QRC721. Estos son requisitos previos:

  • Instale el compilador de solidity desde un paquete binario o el código fuente.
  • Instale Solar: la herramienta de implementación de contratos inteligentes de Qtum.
  • Instale las siguientes dependencias:
  • $ git clone https://github.com/Qtumproject/QRC721Token.git
  • $ cd QRC721Token
  • $ npm instal

Implementar QRC721

Debe iniciar un nodo completo de Qtum utilizando un nodo Qtum QT de testnet. Puede implementar el nodo en Mac mediante este fragmento:

$ /Applications/Qtum-Qt.app/Contents/MacOS/Qtum-Qt -testnet -server -rpcuser = lickey -rpcpassword = Qtum -rpcport = 13889

NOTA: Especifique el nombre de usuario, la contraseña y el puerto para las interfaces RPC. También debe poseer algunos tokens Qtum en el nodo para el gas de contrato.

Utilice Solar para implementar el contacto QRC721. El comando debe ejecutarse utilizando el directorio QRC721Token.

Todos los contratos confirmados

contratos desplegados / QRC721.sol => 780e2578b08dddc56ca518277a18a2fb6f14da61

En esta sección, reemplace el término nombre y símbolo con lo que desee.

Finalmente, se genera un archivo llamado solar.development.json en el directorio actual con información sobre el contrato implementado.

Obtenga más información sobre QRC721 aquí.

Conclusion

Qtum reúne UTXO de Bitcoin y EVM de Ethereum en un paquete perfecto. Los estándares QRC20 y QRC721 permiten a los usuarios traer tokens fungibles y no fungibles al ecosistema de Qtum. En la siguiente parte, veremos el estándar QRC1155.

Texto de ejemplo

Preste atención a las hendiduras y el ajuste de línea que no se pueden mostrar en el formato siguiente.

  1. Obtener saldo de tokens

qtum-cli callcontract \

{TOKEN_CONTRACT_ADDRESS} \

70a08231{to32bytesArg(addressToHash160($userAddress))}

2. Retirar

qtum-cli sendtocontract \

{TOKEN_CONTRACT_ADDRESS} \

a9059cbb{to32bytesArg(addressToHash160($userAddress))}{to32bytesArg(addDecimals($amount)) \0 \

{DEFAULT_GAS_LIMIT} \

{DEFAULT_GAS_PRICE} \

{MAIN_QRC_ADDRESS}

3. Registros de depósito y retiro

qtum-cli searchlogs \

STARTING_BLOCK \

999999999 \

‘{ “addresses”: [“TOKEN_CONTRACT_ADDRESS”]}’ \

‘{“topics”: [“ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef”]}’

4. dueño de ()

contract X {

mapping(uint256 => address) private tokenOwners;

mapping(uint256 => bool) private tokenExists;

function ownerOf(uint256 _tokenId)

constant returns (address owner) {

require(tokenExists[_tokenId]);

return tokenOwners[_tokenId];

}

}

5. aprobar ()

contract X {

mapping(address => mapping (address => uint256)) allowed;

function approve(address _to, uint256 _tokenId){

require(msg.sender == ownerOf(_tokenId));

require(msg.sender != _to);

allowed[msg.sender][_to] = _tokenId;

Approval(msg.sender, _to, _tokenId);

}

}

6. tomar posesión ()

contract X {

function takeOwnership(uint256 _tokenId){

require(tokenExists[_tokenId]);

address oldOwner = ownerOf(_tokenId);

address newOwner = msg.sender;

require(newOwner != oldOwner);

require(allowed[oldOwner][newOwner] == _tokenId);

balances[oldOwner] -= 1;

tokenOwners[_tokenId] = newOwner;

balances[newOwner] += 1;

Transfer(oldOwner, newOwner, _tokenId);

}

}

7. transferencia ()

contract X {

mapping(address => mapping(uint256 => uint256)) private ownerTokens;

function removeFromTokenList(address owner, uint256 _tokenId) private {

for(uint256 i = 0;ownerTokens[owner][i] != _tokenId;i++){

ownerTokens[owner][i] = 0;

}

}

function transfer(address _to, uint256 _tokenId){

address currentOwner = msg.sender;

address newOwner = _to;

require(tokenExists[_tokenId]);

require(currentOwner == ownerOf(_tokenId));

require(currentOwner != newOwner);

require(newOwner != address(0));

removeFromTokenList(_tokenId);

balances[oldOwner] -= 1;

tokenOwners[_tokenId] = newOwner;

balances[newOwner] += 1;

Transfer(oldOwner, newOwner, _tokenId);

}

8. token de propietario por índice () [Opcional]

contract X {

mapping(address => mapping(uint256 => uint256)) private ownerTokens;

function tokenOfOwnerByIndex(address _owner, uint256 _index) constant

returns (uint tokenId){

return ownerTokens[_owner][_index];

}

}

9. Solar

$ solar deploy contracts/QRC721.sol ‘[“name”,”symbol”]’ — qtum_rpc=http://lickey:Qtum@127.0.0.1:13889

exec: solc [contracts/QRC721.sol — combined-json bin,metadata — optimize — allow-paths /Users/Qtum/Code/QRC721Token/QRC721Token]

cli gasPrice 40 40

10. solar.development.json

// part of solar.development.json

{

“contracts”: {

“contracts/QRC721.sol”: {

“source”: “contracts/QRC721.sol:QRC721”,

“abi”: …,

“bin”: “…”,

“binhash”: “f9f27b8932c3bdfe03975201cbdd43c4058de166e737f044b43f53446d19468e”,

“name”: “QRC721”,

“deployName”: “contracts/QRC721.sol”,

“address”: “780e2578b08dddc56ca518277a18a2fb6f14da61”,

“txid”: “45f71bf4d95680e15a4d857e17be2a13aa8f85403a1e624db4151d8cfb98bf5b”,

“createdAt”: “2018–11–12T16:21:33.205371334+08:00”,

“confirmed”: true,

“sender”: “qK2ha4bbrVusPwDvM243mLg4SAke9RqUrv”,

“senderHex”: “1022ba6fa5f2515857a5b226141144b74c3c7d85”

}

. . .

}

}

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response