[Blockchain] Ingreso al mundo de web3: manejo de excepciones/límites en la interacción de contratos

En los contratos inteligentes de Ethereum, el manejo de excepciones es un tema muy importante, porque cualquier llamada de función puede causar una excepción. Las excepciones comunes incluyen fallas en las llamadas a funciones, parámetros no válidos, errores internos y más.

        En Solidity, puede usar palabras clave como requerir, afirmar y revertir para manejar las excepciones. Estas palabras clave se pueden usar para inspeccionar parámetros de entrada, variables de estado y valores devueltos de llamadas a funciones, y lanzar excepciones cuando ocurren excepciones.

        Hoy manejamos principalmente las excepciones desde la perspectiva del front-end, para garantizar el progreso normal de nuestra interacción.

1. Divida el directorio del proyecto para administrar mejor nuestros scripts web3

    

Hacer nuestro código más claro y conciso.

  • El ABI se utiliza para interactuar con el contrato inteligente en web3. Es el canal para que interactuemos con el contrato inteligente. El ABI se puede administrar de manera uniforme a través de nombres para facilitar el mantenimiento posterior;
  • En el proceso de interacción con el contrato inteligente, es necesario llamar a la interfaz ABI y usar algunas bibliotecas web3 como web3.js/ethers.js para conectar la billetera y obtener la dirección, etc., que se puede poner en la carpeta web3 para administrar la unificación.

ABI (interfaz binaria de aplicación) es una especificación de interfaz utilizada para describir los métodos de comunicación y los formatos de datos entre diferentes módulos. En el contrato inteligente de Ethereum, ABI se usa para describir la interfaz del contrato inteligente, incluida la dirección del contrato, el nombre de la función, los parámetros de la función y el valor devuelto, etc.

2. El manejo de excepciones del front-end en la interacción del contrato

En las secuencias de comandos web3, debemos lanzar excepciones a través de try{} catch {}. Las excepciones comunes incluyen:

  • La conexión de la billetera es anormal;
  • Negativa a pagar durante el proceso de pago interactivo de blockchain ;
  • El rpc es incorrecto y la interacción es anormal;
  • Se informa un error al llamar al contrato (el método no existe, los parámetros no son iguales);
  • Y muchos muchos mas...

3. Los siguientes son algunos métodos comunes de manejo de excepciones

3.1, try{} catch {} capture arroja una excepción


/**
  * 域名是否可注册
  * @param domainName domainName without .bnb
  * @returns boolean, if no error
  */
 static async isDomainAvailable(domainName: String): Promise<any> {
    try {
        const isAvailable = await BnbDomainUtils.registrarControllerContractReadOnly.available(domainName)
        return isAvailable
    } catch (error) {
        console.log(error);
        return false
    }
}

3.2 Comprobar si la transacción se ha realizado correctamente

        Al enviar una transacción a un contrato inteligente, es necesario verificar si la transacción fue exitosa. Puede usar el método de envío proporcionado por Web3.js, que devolverá un objeto Promesa, puede obtener el valor hash de la transacción en el método entonces y manejar la excepción en el método de captura.


myContract.methods.myFunction().send({ from: myAddress })
  .then((receipt) => {
    // 处理交易成功的情况
  })
  .catch((error) => {
    // 处理交易失败的情况
  });

3.3 Capturar excepción de llamada de función de contrato inteligente

        Al llamar a funciones de contratos inteligentes, pueden ocurrir excepciones, como parámetros inválidos pasados, estado que no cumple con los requisitos, etc. Puede usar el método de llamada proporcionado por Web3.js, que devuelve un objeto Promise, puede obtener el valor de retorno de la función en el método then y manejar la excepción en el método catch.


myContract.methods.myFunction(myArg).call()
  .then((result) => {
    // 处理函数调用成功的情况
  })
  .catch((error) => {
    // 处理函数调用失败的情况
  });

3.4 Manejo de excepciones de MetaMask

        Al usar MetaMask para interactuar con contratos inteligentes, pueden ocurrir excepciones como la autorización no autorizada del usuario y el rechazo de transacciones. Puede usar el objeto ethereum proporcionado por MetaMask, que contiene la API para interactuar con la billetera.


if (window.ethereum) {
  try {
    await window.ethereum.enable();
    // 处理用户已授权的情况
  } catch (error) {
    // 处理用户未授权的情况
  }
} else {
  // 处理用户未安装 MetaMask 的情况
}

3.5 Usando detectores de eventos

        En los contratos inteligentes, los eventos se pueden usar para notificar al front-end de ciertos cambios de estado. Los eventos se pueden definir en el contrato inteligente y luego usar Web3.js en el front-end para monitorear la activación del evento.

        Al usar el detector de eventos, el front-end puede obtener los cambios de estado del contrato inteligente en tiempo real, a fin de tratar situaciones anormales de manera más oportuna.


// Solidity 中定义事件
event Transfer(address indexed from, address indexed to, uint256 value);

// 前端中监听事件
myContract.events.Transfer()
  .on('data', (event) => {
    // 处理事件触发的情况
  })
  .on('error', (error) => {
    // 处理事件监听失败的情况
  });

3.6 Limitar la cantidad de gas para transacciones

        Al enviar una transacción a un contrato inteligente, se puede especificar la cantidad de gas para la transacción. Si no hay suficiente gas, la transacción fallará y se revertirá. La cantidad de gas de la transacción se puede limitar en la parte delantera para garantizar que la transacción se pueda ejecutar con éxito.

        Al limitar la cantidad de gas de la transacción, el front-end puede evitar la falla de la transacción.


const gasLimit = 250000;
myContract.methods.myFunction().send({ from: myAddress, gas: gasLimit })
  .then((receipt) => {
    // 处理交易成功的情况
  })
  .catch((error) => {
    // 处理交易失败的情况
  });

3.7 Manejo de excepciones de red

        Al interactuar con contratos inteligentes, puede encontrar anomalías en la red, como demoras en la red, desconexiones, etc. Puede usar el método setProvider proporcionado por Web3.js para configurar el proveedor de red en el front-end para garantizar la estabilidad de la interacción.

        Al configurar el proveedor de red, el front-end puede evitar anomalías en la red.


// 1、使用web3
const provider = new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/YOUR-PROJECT-ID');
const web3 = new Web3(provider);

// 2、使用ethers
const provider = new ethers.providers.JsonRpcProvider(process.env.READ_ONLY_RPC)
new ethers.Contract(
    contractAddress,
    Abi,
    provider
)

En conclusión, al interactuar con contratos inteligentes, las excepciones deben manejarse con cuidado para garantizar la corrección y confiabilidad de las transacciones. Puede usar la API proporcionada por Web3.js y MetaMask para manejar las excepciones.

Supongo que te gusta

Origin blog.csdn.net/qq_23334071/article/details/130179911
Recomendado
Clasificación