Analizar el uso de gas y el diseño del contrato.

Supongamos que tengo el siguiente código de contrato:

pragma solidity ^0.4.23;

contract pensCollection{

    struct Pen{
        uint productCode;
        address ownerAddress;
    }

    address public owner;

    // history of a pen.
    mapping(uint => address[]) public __history;

    // One account can hold many pens.
    mapping(address => Pen[]) public __inventary;

    constructor () public{
        owner = msg.sender;
    }


    function addPen(uint _productCode, address _ownerAddress) public returns (address) {


        Pen memory _pen = Pen({
            productCode : _productCode,
            ownerAddress : _ownerAddress
            });
        __inventary[_ownerAddress].push(_pen);

        // Add history entry for this new pen.
        __history[_productCode].push(_ownerAddress);

        return msg.sender;
    }

    function exchangePen(address _buyer, uint _productCode) public returns (bool) {

       // Search for pen in the inventary.
        for (uint i = 0; i < (__inventary[msg.sender].length); i++) {

            // If I find it then change its owner address.
            if (__inventary[msg.sender][i].productCode == _productCode) {

                Pen memory _pen = Pen(
                    {
                    productCode : _productCode,
                    ownerAddress : _buyer
                    });
                __inventary[_buyer].push(_pen);
                __history[_productCode].push(_buyer);

                delete __inventary[msg.sender][i];
                return true;
            }
        }

        return false;
    }

    function getHistoryForPen(uint _productCode) public view returns (address[]) {
        return __history[_productCode];
    }
}

Este contrato debería permitir a los usuarios registrar una serie de bolígrafos en un contrato inteligente. Hay un mapeo donde para cada dirección de propietario tengo una matriz de Pendonde Pen es una estructura. Puedo agregar un bolígrafo a la colección ( __inventaryvariable) usando el método addPen(...). También puedo intercambiar bolígrafos con la función exchangePen(...)en la que el bolígrafo dado se transfiere a la dirección del comprador y se retira del propietario anterior. También hay una matriz, llamada __history, donde se registran todos los movimientos (compras/ventas) y el usuario puede obtener esta matriz llamando al método apropiado. Cuando compilo este código con remix en línea, recibo la advertencia del uso de gas, porque si no me equivoco, almacenar datos en el estado del contrato es una mala práctica que cuesta mucho gas y puede causar la excepción del tiempo de ejecución de quedarse sin gas.

Una de mis preguntas es: ¿Cómo puedo causar esta excepción? ¿Cuántos bolígrafos debo insertar antes de obtener la excepción gasLimit?

La otra pregunta es: ¿Debo implementar un contrato que represente solo una pluma con el método para transferir y para la historia? Quiero decir, ¿el siguiente contrato es mejor que el anterior?

pragma solidity ^0.4.23;

contract PenContract{

    struct Pen{
        uint productCode;
        address ownerAddress;
    }

    address public owner;
    Pen public _pen;

    // history of a pen.
    address[] public __history;


    constructor (uint _productCode, address _ownerAddress) public{
        owner = msg.sender;
        _pen.productCode = _productCode;
        _pen.ownerAddress = _ownerAddress;

        // Add history entry for this new pen.
        __history.push(_ownerAddress);
    }


    function exchangePen(address _buyer) public returns (bool) {
        _pen.ownerAddress = _buyer;
        __history.push(_buyer);
        return true;            
    }

    function getHistoryForPen() public view returns (address[]) {
        return __history;
    }
}

En otras palabras, dado el hecho de que implementar un contrato inteligente cuesta 32k de gasolina ( aquí ), ¿es mejor tener un contrato que administre todos los bolígrafos y que le permita agregar otros (posiblemente causando el problema del límite de gasolina) o es mejor? implementar un contrato para cada bolígrafo (¿esto también puede causar el problema?)?

Gracias de antemano.

Respuestas (2)

Posible duplicado: creación de contratos múltiples o contrato único con estructura

Otros tipos de matrices dinámicas pueden crecer hasta 2^256-1 elementos.

Espero que ayude: siempre almaceno datos en asignaciones en lugar de matrices. Las matrices pueden ser realmente costosas como dijiste. De modo que puede almacenar sus bolígrafos en mapeos y luego iterarlos con una función de vista que no cuesta nada. Solo una nota, no una respuesta completa 😉

Suerte con el contrato

Narper