¿Tiene sentido gestionar el equilibrio manualmente dentro del smartcontract?
Estoy usando Solidity para desplegar un contrato inteligente en una red Ethereum de prueba lanzada por Ganache. He leído algo de código de demostración del contrato y uno de ellos se ve así:
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.4;
pragma experimental ABIEncoderV2;
contract Ledger {
struct TransferRequest {
string title;
uint256 amount;
string bsb;
string accountName;
string accountNumber;
}
mapping(address => uint256) balances;
address payable owner;
event Transfered(bool _success, address _from, address _to, uint256 amount);
constructor() payable {
owner = payable(msg.sender);
balances[tx.origin] = 10000;
}
function sendCoin(address payable receiver, uint256 amount)
payable public
{
require(msg.sender == owner);
if (balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfered(true, msg.sender, receiver, amount);
}
function getBalance(address addr) public view returns (uint256) {
return balances[addr];
}
}
Como se puede ver arriba, el contrato administra el balance por sí mismo en lugar de utilizar el balance de la cadena de bloques. No hay ninguna transferencia real de éter dentro del método sendCoin. ¿Qué significa esto? ¿Significa que no hay transacción real en la cadena de bloques? Entonces, ¿cuál es el punto de construir un contrato así? ¿Cuál sería la relación entre el balance administrado por la cadena de bloques y el balance administrado por el contrato?
davy.ai
Este contrato en realidad no realiza una transferencia de ether cuando se llama
sendCoin
, pero eso no significa que no haya una transacción real en la cadena de bloques. El mapeobalances
mantiene la cantidad de ether que cada dirección tiene, según lo gestionado por el contrato inteligente. Cuando se llamasendCoin
, se actualiza el mapeobalances
, lo que, en última instancia, actualiza el estado de la cadena de bloques.De esta manera, la relación entre el
balance
gestionado por la cadena de bloques y elbalance
gestionado por el contrato es que este último es un subconjunto del primero. El mapeo debalances
del contrato es esencialmente una caché del balance actual para cada dirección en el sistema. Cuando un usuario desea enviar ether a otra dirección, se incluirá una transacción en la cadena de bloques que llama al métodosendCoin
, que a su vez actualiza el mapeobalances
, y finalmente actualiza el estado de la cadena de bloques al comprometer los nuevos datos debalances
en el libro mayor de la cadena de bloques.El objetivo de construir un contrato como este es permitir que se realice una lógica más compleja sobre la funcionalidad básica de la cadena de bloques. El contrato
Ledger
se puede extender o modificar para realizar operaciones adicionales, como llevar un registro de transacciones o hacer cumplir los controles de acceso. Además, al gestionar los balances internamente, el contrato puede proporcionar un control más detallado sobre cómo se transfieren y almacenan los éteres dentro del sistema.