¿Se puede acuñar y recompensar automáticamente el token ERC20 en función de cualquier comando? [cerrado]

Tengo un proyecto en el que pretendo pagar a mis usuarios a través de un token ERC20.

Tenemos la intención de desarrollar una máquina de aprendizaje de IA que recopilará información de las actividades de los usuarios en función de la tarea que deben realizar en nuestra plataforma para recibir el pago. Queremos que el software de IA interactúe con el contrato inteligente actualizándolo con la información necesaria. Una vez que el contrato inteligente recibe dicha información, acuñará el token necesario y recompensará a cada miembro en su billetera ethereum según el informe que ha proporcionado la IA.

Me gustaría saber si esto es posible y cómo se podría hacer.

Su amable contribución será muy apreciada.

Gracias

Usar un solo enlace de API para generar resultados y, en función de los tokens de menta de resultados (incluso si usa el mejor sistema Oracle confiable), anula el propósito de un contrato inteligente de blockchain, que es hacerlo totalmente descentralizado y sin confianza.

Respuestas (1)

Función ERC balanceOf

El saldo ERC 20 de una dirección de cuenta es simplemente lo que la balanceOffunción diga que es.

Como puede definir la función, puede decidir qué dice el saldo para cada cuenta.

Esto significa que puede hacer todo tipo de cosas extravagantes, en función de cómo decida que debe operar el contrato.

No hay nada especial o místico en un token ERC20, aparte de la especificación de los nombres de funciones requeridos.

Monedas de "acuñación"

Para la mayoría de los contratos, acuñar monedas no es más que sumar un número a una variable sin restar un número a otra variable. Por el contrario, quemar monedas es restar un número de una variable sin sumarlo a otra variable. Generalmente las variables que manejan los saldos son un mapeo entre la dirección de la cuenta y el saldo.

Ejemplo

/// @notice Will cause a certain `_value` of coins minted for `_to`.
/// @param _to The address that will receive the coin.
/// @param _value The amount of coin they will receive.
function mint(address _to, uint _value) public {
    require(msg.sender == owner); // assuming you have a contract owner
    balances[_to] += value;
    supply += value;
    require(balances[_to] >= value && supply >= value); // overflow checks
    emit Transfer(address(0), _to, _value);
}

Pero esto no está escrito en piedra y su contrato puede hacer cualquier cosa desde dentro de la balanceOffunción que posiblemente pueda pensar.

Para responder a su pregunta específicamente, sí, puede tener una función a la que solo usted puede llamar que creará nuevos tokens de la nada en función de las acciones del usuario externas al contrato.

Gasolina costosa?

Tenga en cuenta que llamar a la mint()función como se define le costará gasolina a usted (o a alguien) cada vez que ejecute la función para crear los nuevos tokens.

A menudo, para aliviar este problema, las personas incluirán la funcionalidad "por lotes" o "lanzamiento aéreo" en el contrato para que se puedan realizar múltiples actualizaciones dentro de una sola llamada y así ahorrar gasolina.

Ejemplo:

/// @notice Will cause a certain `_value` of coins minted for `_to`.
/// @param _to The address that will receive the coin.
/// @param _value The amount of coin they will receive.
function mint(address _to, uint _value) public {
    require(msg.sender == owner); // assuming you have a contract owner
    mintToken(_to, _value);
}

/// @notice Will allow multiple minting within a single call to save gas.
/// @param _to_list A list of addresses to mint for.
/// @param _values The list of values for each respective `_to` address.
function airdropMinting([]address _to_list, []uint _values) public {
    require(msg.sender == owner); // assuming you have a contract owner
    require(_to_list.length == _values.length);
    for (uint i = 0; i < _to_list.length; i++) {
        mintToken(_to_list[i], _values[i]);
    }
}

/// Internal method shared by `mint()` and `airdropMinting()`.
function mintToken(address _to, uint _value) internal {
    balances[_to] += value;
    supply += value;
    require(balances[_to] >= value && supply >= value); // overflow checks
    emit Transfer(address(0), _to, _value);
}

En este ejemplo, puede llamar a la función airdropMinting una vez al día (o cualquier intervalo que considere adecuado) con una lista de elementos de acuñación y ejecutará cada uno por turno, ahorrando alrededor de 21,000 gas por elemento adicional.

Nota: hemos redefinido mint() para llamar a una función de acuñación interna, y aunque podríamos haber llamado a la mint()función original desde adentro mintToken(), la llamada de una función externa desde internamente tiene un costo adicional de gasolina.

Nota 2: hay un límite en la cantidad de artículos que puede acuñar a la vez, y esto se basa en el límite de gas global de 8 millones de gas.

Si esto respondió a su pregunta, por favor márquelo como la respuesta correcta. Si no, hágamelo saber para que pueda ayudarlo más.
esa es una hermosa respuesta en realidad. seguro que me ayuda especialmente sobre llamadas internas / externas, no lo sabía.