Costo de gas de base de datos en Smartcontract

¿Cómo puedo almacenar una "base de datos" en un contrato inteligente y cómo se calcularía el costo, cuánto me costará la gasolina?

Un ejemplo práctico sería, tengo una aplicación de Android que llama a un contrato inteligente con ethereum-android-lib y le agrega datos, supongo que estos datos pueden ser recuperados por otro cliente de Android. ¿Cuál será el costo de ingresar estos datos en el contrato inteligente? ¿Es la cantidad de datos nuevos que estoy tratando de ingresar o el costo total de todos los datos que están en el contrato inteligente?

El pseudo contrato en el que pensé se vería así:

contract patientRecord {
  address public owner;
  uint public numFiles;
  struct File {
    uint name;
    bytes32 illness;
  }
  mapping(uint => File) public files;

  // add a new file
  function files(bytes32 _message) {
    if (msg.value == 0 || complete || refunded) throw;
    files[numFiles] = Pledge(msg.value.name, msg.value.illness);
    numFiles++;
  }

  function retreive(uint id){
      //get back file of a pateint with ID
  }

  function retreive(uint id){
      //modify some value in a file
  }

}
Realmente esto no me dice cuánto cuesta almacenar un archivo en la cadena de bloques, pero quiero saber cuánto me costará. Cuando agrego datos a un contrato
Deberías estar probando tu código. Escriba algunas pruebas y averigüe cuánto gas cuesta. De lo contrario, tendrá que mirar el código de la máquina y calcularlo manualmente utilizando el costo de las operaciones del gas (por ejemplo, en el papel amarillo o en Google, ya que se ha cambiado desde entonces). Voto dejar abierto a menos que haya una buena guía práctica sobre cómo estimar los costos de gasolina ya en un conjunto de preguntas/respuestas.

Respuestas (1)

Esta pregunta ha estado dando vueltas por un tiempo. Creo que posiblemente merece una respuesta direccional resumida.

Primero, algunos grandes titulares que pueden no parecer especialmente importantes inicialmente o que posiblemente sean difíciles de digerir de un trago.

  1. No migre diseños de bases de datos existentes o imaginados directamente al almacenamiento de blockchain. Adopte un enfoque minimalista para el almacenamiento en cadena. En mi opinión , el contrato inteligente debería garantizar la integridad de la aplicación. Por extensión, el contrato inteligente debe garantizar la integridad de los datos. Los campos y descriptores superfluos generalmente van a otro lugar donde el almacenamiento y el rendimiento son abundantes y baratos.
  2. Las tarifas de gas son para los bytes almacenados y los OpCodes ejecutados. De nuevo, minimalismo porque cada byte cuenta .

Dado lo anterior, muchos diseños tienden hacia el almacenamiento de claves esenciales y poco más.

En términos de una base de datos relacional , las claves primarias y las claves externas pueden ser el almacenamiento en cadena mínimo requerido para hacer cumplir la integridad referencial. " Address Line 2" es el tipo de descriptor que no ayuda en ese sentido, por lo que es un buen candidato para almacenar en otro lugar.

Podría, por ejemplo, serializar todos los descriptores y almacenar el resultado en una ubicación fuera de la cadena: una base de datos tradicional, IPFS, Swarm... y luego almacenar la ubicación y el hash de los datos actuales en el contrato inteligente. De esta forma, el contrato inteligente proporciona un puntero a "más información" y una forma de confirmar la fidelidad de los datos cargados desde esa ubicación.

La única forma de saber el costo exacto del almacenamiento en cadena byte por byte es probar algo y medirlo. Eso implica encontrar una dirección y codificarla. Con ese fin, se despliegan aquí algunos patrones básicos y sus fortalezas y debilidades:

¿Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?

Esos patrones están diseñados para que el costo del gas sea consistente en cualquier escala. porque es sumamente importante evitar diseñar algo con un costo creciente a medida que crece el conjunto de datos. Un artículo vinculado cerca del final revela los costos de gas medidos para el ejemplo.

Notoriamente ausente de esta lista está cualquier forma de clasificar/ordenar . Un contrato inteligente que se enfoca en la integridad a menudo puede ignorar esa consideración. Es decir, si los clientes necesitan datos ordenados, las optimizaciones a menudo se pueden realizar en el lado del cliente. Los contratos inteligentes se simplifican considerablemente al centrarse en permitir/no permitir inserciones, eliminaciones, actualizaciones, etc. Rara vez necesita una lista ordenada.

Habiendo dicho eso, una lista enlazada es una forma económica de lograr resultados ordenados que se pueden buscar si es necesario. Encontrará un ejemplo experimental de LinkedList aquí:

https://bitbucket.org/rhitchens2/soliditystoragepatterns

Nuevamente, énfasis en la simplicidad y el costo constante del gas a cualquier escala. Simplemente no funcionará si los costos de operaciones como insertar y buscar aumentan con el tamaño del conjunto de datos.

Además, una colección generalizada y un ejemplo experimental de hacer cumplir la integridad referencial en una relación de uno a muchos. Código en el repositorio vinculado anteriormente. Explicación aquí: https://medium.com/@robhitchens/enforcing-referential-integrity-in-ethereum-smart-contracts-a9ab1427ff42

Espero eso ayude.