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
El saldo ERC 20 de una dirección de cuenta es simplemente lo que la balanceOf
funció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.
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.
/// @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 balanceOf
funció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.
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.
/// @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.
andy b