Conceptos básicos y flujo de trabajo sobre la creación y ejecución de contratos inteligentes

Estoy confundido acerca de cómo funcionan internamente los contratos inteligentes.
He leído esto:
https://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05

TLTR: hay un ejemplo de un contrato inteligente "Prueba de existencia" que guarda el hash de alguna cadena en una matriz

contract ProofOfExistence3 {
  mapping (bytes32 => bool) private proofs;
  // store a proof of existence in the contract state
  function storeProof(bytes32 proof) {
    proofs[proof] = true;
  }
  // calculate and store the proof for a document
  function notarize(string document) {
    var proof = proofFor(document);
    storeProof(proof);
  }
  // helper function to get a document's sha256
  function proofFor(string document) constant returns (bytes32) {
    return sha256(document);
  }
  // check if a document has been notarized
  function checkDocument(string document) constant returns (bool) {
    var proof = proofFor(document);
    return hasProof(proof);
  }
  // returns true if proof is stored
  function hasProof(bytes32 proof) constant returns(bool) {
    return proofs[proof];
  }
}

Mis preguntas:
1) ¿Qué sucede cuando implemento ese contrato? en términos de la cadena de bloques Ethereum. ¿El código se guarda en un nuevo bloque en la red Ethereum? Quiero decir, en Bitcoin enviamos algunos BTC de una dirección a otra, y esa información se guarda en un nuevo bloque. ¿Hay alguna analogía con esto para Ethereum y Smart Contracts?

2) ¿Hay algún costo para implementar el contrato inteligente?

3) ¿Cómo puedo usar ese contrato? Digamos que quiero verificar si existe alguna cadena allí, ¿cómo puedo hacer eso? lo mismo si quiero guardar una nueva cadena. ¿Cuál es el flujo de trabajo para ejecutar alguna función del contrato inteligente (y obtener el resultado)?

4) ¿Necesitamos ETH para ejecutar alguna función en el contrato inteligente? ¿por qué? ¿Qué sucede en la cadena de bloques cuando se ejecuta (no se implementa)?

Sé que esto podría ser un poco largo para responder, pero estoy bastante seguro de que será una buena referencia para muchos novatos como yo :)

Respuestas (1)

  1. Envíe tx para crear una nueva cuenta, una cuenta de contrato que se almacena en el estado mundial (que es un mapeo de las cuentas y el estado de la cuenta). Esto crea un almacenamiento de contrato, el código de bytes de nuestro contrato inteligente se almacena/referencia. Los bloques contienen hashes raíz del estado actual, transacciones en el bloque y recibos de transacciones (entre otras cosas).
  2. La implementación de contratos cuesta gasolina, de hecho, un mínimo de 32 000 (CREATE Opcode). Esta cantidad aumenta según el tamaño del código de bytes y las funciones del constructor que se ejecutan en la implementación.
  3. Hay algunos métodos diferentes. Puede usar la consola geth e interactuar con ella a través de RPC. O use truffle framework y truffle console , que le brinda una instancia web3. Se puede llamar a cualquier método de contrato que sea público/externo. También hay bibliotecas disponibles como web3js o ethersjs para crear aplicaciones del lado del cliente con sus marcos JS favoritos como reaccionar, vue o angular.
  4. Necesitamos pagar gasolina (que es una pequeña cantidad de éter) por cada transacción. Si llamamos a un contrato, agregamos datos de llamada a nuestra transacción. Este contiene las funciones y parámetros codificados que queremos llamar en nuestro contrato (enviar transacción con los datos de la llamada a la dirección del contrato). Cada operación cuesta una cantidad específica de gas, por lo que dependiendo de la complejidad de la lógica, los costos de gas pueden aumentar. Este gas se usa para pagar los nodos que procesan su transacción (ejecutando la llamada). El gas está allí principalmente para evitar el spam y el problema de detención (los bloques tienen límite de gas).

El papel blanco y amarillo de ethereum es un muy buen lugar para comenzar. También: https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369

Todavía estoy confundido acerca de 3. ¿Todo contrato inteligente tiene una dirección? (¿No estoy seguro si es una dirección normal de Ethereum, como una billetera?), así que supongo que para llamar a una función necesitamos esa dirección y el nombre de la función (algunos de ellos están normalizados si es ERC20). Y necesitamos pagar el gas para ejecutar la función (no sabremos cuánto es esto, ¿verdad? ¿Por eso ponemos un límite?). Entonces, en este ejemplo, cada usuario con una cuenta de Ethereum y ETH (para pagar gasolina) que conoce la dirección del contrato inteligente podría ejecutar las funciones. y cada vez que llamamos a una función se agrega un nuevo bloque a la cadena Ethereum?
Es una dirección ethereum normal, pero la diferencia con respecto a una dirección de usuario es que tiene un código de bytes asociado (ver extcodesize() en el papel amarillo). Los contratos también pueden contener ethereum. Hay un límite en el gas debido a que hay un límite de gas para bloques, por lo que una operación no puede repetirse para siempre. Si se alcanza el límite de gas o una transacción se queda sin gas, se lanza una excepción de "sin gas", revirtiendo la transacción y devolviendo el gas no gastado al usuario. Llamar a una función significa enviar una transacción con datos de llamada a una dirección de contrato.