Cómo crear en el régimen de prueba "hola mundo": mi primer y simple contrato en Parity Wallet for Win

  1. paridad.exe

  2. "Contratos"

  3. "Desarrollar contrato"

  4. En la ventana "Nuevo contrato de solidez" escribió:

    /*
    from here:
    https://ethereum-homestead.readthedocs.io/en/latest/contracts-and-transactions/contracts.html#writing-a-contract
    */
    
    contract HelloWorld {
            event Print(string out);
            function() { Print("Hello, World!"); }
    }
    
  5. Compilar

  6. Desplegar

  7. ¿Y que?

Estoy atascado aquí (no tengo gasolina ni dinero en la cuenta actual)

Nota: El documento original de Parity sobre contratos no me queda claro:

https://github.com/paritytech/parity/wiki/Tutorial-Part-6

Respuestas (1)

Parity Ethereum admite la programación de contratos inteligentes orientada al estado con el lenguaje de programación Solidity para la cadena de bloques de Ethereum. La billetera contiene un entorno de desarrollo Solidity integrado que le permite escribir, compilar e implementar contratos.

contratos-desarrollar-0 La vista de desarrollo de contrato contiene un panel de código de contrato (izquierda) y parámetros de configuración (derecha).

contratos-desarrollar-1 Para comenzar con su primer contrato, es posible cargar o importar contratos existentes.

Nuestro primer contrato será un Greeter "¡Hola, mundo!" contrato:

pragma solidity ^0.4.11;

contract greeter {

    address owner;
    string message;

    function greeter(string _message) public {
        owner = msg.sender;
        message = _message;
    }

    function say() constant returns (string) {
        return message;
    }

    function die() {
        if (msg.sender == owner) {
            selfdestruct(owner);
        }
    }
}

Este contrato contiene dos variables miembro, un constructor y dos funciones. Se llamará al constructor una vez tras la implementación del contrato, establece el propietario del contrato como el remitente de la transacción y almacena el mensaje proporcionado.

La función constante say()simplemente devuelve el mensaje proporcionado en cada llamada y die()permite que el creador del contrato autodestruya el contrato y limpie el estado.

contratos-desarrollar-2 Creemos el contrato de Greeter en el entorno de desarrollo integrado de Solidity. Tenga en cuenta que pragma solidity ^0.4.11requiere una versión del compilador de Solidity de 0.4.11 o superior que se puede seleccionar a la derecha.

contratos-desarrollar-3 Antes de compilar el contrato, guardemos el Greeter "¡Hola, mundo!" contrato para uso posterior.

contratos-desarrollar-4 Ahora, el entorno Parity Solidity permite compilar el código de bytes requerido para la implementación en la cadena de bloques y generar la interfaz binaria de la aplicación (ABI) requerida para la interacción del contrato.

contratos-desarrollar-5 Una característica útil es la optimización del código y la compilación automática que regenera el código de bytes y el ABI a medida que codifica.

Una vez que haya terminado con estos pasos, Parity Ethereum nos proporciona la siguiente interfaz JSON (ABI), código de bytes, metadatos y el hash de enjambre.

Interfaz binaria de aplicación (ABI):

[
  {
    "constant":false,
    "inputs":[

    ],
    "name":"die",
    "outputs":[

    ],
    "payable":false,
    "type":"function"
  },
  {
    "constant":true,
    "inputs":[

    ],
    "name":"say",
    "outputs":[
      {
        "name":"",
        "type":"string"
      }
    ],
    "payable":false,
    "type":"function"
  },
  {
    "inputs":[
      {
        "name":"_message",
        "type":"string"
      }
    ],
    "payable":false,
    "type":"constructor"
  }
]

Código de bytes compilado:

0x6060604052341561000c57fe5b604051610307380380610307833981016040528051015b60008054600160a060020a03191633600160a060020a03161790558051610051906001906020840190610059565b505b506100f9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009a57805160ff19168380011785556100c7565b828001600101855582156100c7579182015b828111156100c75782518255916020019190600101906100ac565b5b506100d49291506100d8565b5090565b6100f691905b808211156100d457600081556001016100de565b5090565b90565b6101ff806101086000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166335f469948114610045578063954ab4b214610057575bfe5b341561004d57fe5b6100556100e7565b005b341561005f57fe5b610067610129565b6040805160208082528351818301528351919283929083019185019080838382156100ad575b8051825260208311156100ad57601f19909201916020918201910161008d565b505050905090810190601f1680156100d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101265760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101316101c1565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101b65780601f1061018b576101008083540402835291602001916101b6565b820191906000526020600020905b81548152906001019060200180831161019957829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a72305820bcb6dac55886f2319f381c72002482234ee43206c088e0eea076260a472d83230029

Metadatos del contrato:

{
  "compiler":{
    "version":"0.4.11+commit.68ef5810"
  },
  "language":"Solidity",
  "output":{
    "abi":[
      {
        "constant":false,
        "inputs":[

        ],
        "name":"die",
        "outputs":[

        ],
        "payable":false,
        "type":"function"
      },
      {
        "constant":true,
        "inputs":[

        ],
        "name":"say",
        "outputs":[
          {
            "name":"",
            "type":"string"
          }
        ],
        "payable":false,
        "type":"function"
      },
      {
        "inputs":[
          {
            "name":"_message",
            "type":"string"
          }
        ],
        "payable":false,
        "type":"constructor"
      }
    ],
    "devdoc":{
      "methods":{

      }
    },
    "userdoc":{
      "methods":{

      }
    }
  },
  "settings":{
    "compilationTarget":{
      "GreeterHelloWorld":"greeter"
    },
    "libraries":{

    },
    "optimizer":{
      "enabled":true,
      "runs":200
    },
    "remappings":[

    ]
  },
  "sources":{
    "GreeterHelloWorld":{
      "keccak256":"0xe8f8f27c4b8e16a9d3b488f689b9e3018d25bdee6a67734444c9bbbf7a59c731",
      "urls":[
        "bzzr://ed1e3e9a69578ad5ccc4bb33539f802ee94b243163491f6ee3f9456b0ae4d281"
      ]
    }
  },
  "version":1
}

Hachís de enjambre:

bcb6dac55886f2319f381c72002482234ee43206c088e0eea076260a472d8323

Esta información es importante para implementar su contrato inteligente en la cadena de bloques de Ethereum e integrarse en sus aplicaciones descentralizadas. Guárdelos para futuras referencias.

Por cierto, si prefiere usar la línea de comandos y tiene instalado un compilador de Solidity, puede lograr lo mismo emitiendo el siguiente comando, asumiendo que tiene el código de su contrato almacenado en un archivo llamado greeter.sol:

solc --optimize --abi --bin --metadata greeter.sol

======= greeter.sol:greeter =======
Binary:
6060604052341561000c57fe5b604051610307380380610307833981016040528051015b60008054600160a060020a03191633600160a060020a03161790558051610051906001906020840190610059565b505b506100f9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009a57805160ff19168380011785556100c7565b828001600101855582156100c7579182015b828111156100c75782518255916020019190600101906100ac565b5b506100d49291506100d8565b5090565b6100f691905b808211156100d457600081556001016100de565b5090565b90565b6101ff806101086000396000f300606060405263ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166335f469948114610045578063954ab4b214610057575bfe5b341561004d57fe5b6100556100e7565b005b341561005f57fe5b610067610129565b6040805160208082528351818301528351919283929083019185019080838382156100ad575b8051825260208311156100ad57601f19909201916020918201910161008d565b505050905090810190601f1680156100d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101265760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101316101c1565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101b65780601f1061018b576101008083540402835291602001916101b6565b820191906000526020600020905b81548152906001019060200180831161019957829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a7230582033ca9aeef924a814a80886e9f27b539e8c3b71780e6da527ebcd4df6076c45000029
Metadata:
{"compiler":{"version":"0.4.11+commit.68ef5810"},"language":"Solidity","output":{"abi":[{"constant":false,"inputs":[],"name":"die","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[{"name":"_message","type":"string"}],"payable":false,"type":"constructor"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"greeter.sol":"greeter"},"libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"greeter.sol":{"keccak256":"0x2914014e6c5ef4ffd0de42461548cfb78b006af718a3ddf18c9fb851ba457854","urls":["bzzr://622e562f0f51d94c6bd395063133657d178c6c5c7bfd43db6c10470f59eb34ac"]}},"version":1}
Contract JSON ABI
[{"constant":false,"inputs":[],"name":"die","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[{"name":"_message","type":"string"}],"payable":false,"type":"constructor"}]

Tenga en cuenta que el hash de enjambre está codificado en el urlscampo de los metadatos cuando se usa solc.

Ahora, finalmente queremos implementar nuestro contrato, haga clic en el botón Implementar .

contratos-implementar-0 Los contratos de bienvenida se pueden implementar directamente desde dentro de Parity.

contratos-implementar-1 Elige una cadena que te salude.

contratos-implementar-2 Una vez desplegado y minado,...

contratos-implementar-3 ... el contrato está disponible en su billetera Parity Ethereum y permite una interacción básica.

contratos-implementar-4 Utilice la interfaz de contrato para consultar la sayfunción y verifique los resultados de inmediato.

Para implementar el contrato a través de la API JSON-RPC, primero debemos estimar los requisitos de gas con la eth_estimateGasllamada RPC pasando el código de bytes compilado.

curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x00a329c0648769a73afac7f9381e08fb43dbea72", "data": "0x6060604052341561000c57fe5b6040516103aa3803806103aa833981016040528080518201919050505b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019080519060200190610080929190610088565b505b5061012d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c957805160ff19168380011785556100f7565b828001600101855582156100f7579182015b828111156100f65782518255916020019190600101906100db565b5b5090506101049190610108565b5090565b61012a91905b8082111561012657600081600090555060010161010e565b5090565b90565b61026e8061013c6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335f4699414610046578063954ab4b214610058575bfe5b341561004e57fe5b6100566100f1565b005b341561006057fe5b610068610185565b60405180806020018281038252838181518152602001915080519060200190808383600083146100b7575b8051825260208311156100b757602082019150602081019050602083039250610093565b505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561018257600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b61018d61022e565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102235780601f106101f857610100808354040283529160200191610223565b820191906000526020600020905b81548152906001019060200180831161020657829003601f168201915b505050505090505b90565b6020604051908101604052806000815250905600a165627a7a72305820d7c4be18c8e86dd70b00aa0b072cde72893fcaafc766ff7bb86debf4d9357cac00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000"}], "id": 1}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x4414b","id":1}

Ahora que sabemos que el despliegue del contrato costará 278859 de gas (hex 0x4414b), podemos transmitir la transacción:

curl --data '{"method":"eth_sendTransaction","params":[{"from":"0x00a329c0648769a73afac7f9381e08fb43dbea72","gas":"0x4414b","data":"0x6060604052341561000c57fe5b6040516103aa3803806103aa833981016040528080518201919050505b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019080519060200190610080929190610088565b505b5061012d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c957805160ff19168380011785556100f7565b828001600101855582156100f7579182015b828111156100f65782518255916020019190600101906100db565b5b5090506101049190610108565b5090565b61012a91905b8082111561012657600081600090555060010161010e565b5090565b90565b61026e8061013c6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335f4699414610046578063954ab4b214610058575bfe5b341561004e57fe5b6100566100f1565b005b341561006057fe5b610068610185565b60405180806020018281038252838181518152602001915080519060200190808383600083146100b7575b8051825260208311156100b757602082019150602081019050602083039250610093565b505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561018257600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b61018d61022e565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102235780601f106101f857610100808354040283529160200191610223565b820191906000526020600020905b81548152906001019060200180831161020657829003601f168201915b505050505090505b90565b6020604051908101604052806000815250905600a165627a7a72305820d7c4be18c8e86dd70b00aa0b072cde72893fcaafc766ff7bb86debf4d9357cac00290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000"}],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x9f79dbaeab3f0e24bbe2c885432dae3ff4350e357a497e7bf8820a64c219e011","id":1}

Tenga en cuenta que si la cuenta aún no está desbloqueada, debe cambiar a la interfaz de usuario de la billetera y confirmar la transacción con el firmante de confianza.

Ahora entiende la esencia de escribir, compilar e implementar contratos en una cadena Ethereum y sabe cómo llamar a la say()función de nuestro contrato Greeter implementado.

Hay dos formas diferentes de interactuar con los contratos inteligentes en la cadena de bloques de Ethereum. Puede llamar (consultar) o invocar (ejecutar) el contrato. Llamar a un contrato es un proceso de solo lectura y generalmente es gratuito. La invocación de un contrato requiere transmitir una transacción para ejecutar las funciones del contrato deseado y debe cubrirse con una tarifa. Entonces, ejecutemos nuestro contrato de Saludador. Sólo hay una función que se puede ejecutar: die().

contratos-matar-0 Generalmente es una buena práctica limpiar después del desarrollo. Ahora que sabemos que nuestro contrato Greeter desarrollado funciona, lo eliminaremos de la cadena de bloques llamando a la función die que autodestruye el contrato.

contratos-matar-2 Una vez extraído, la función de autodestrucción liberará espacio del estado actual de la cadena de bloques.

contratos-matar-3 Dado que no es posible interactuar con un contrato cancelado, eliminémoslo haciendo clic en el botón Olvidar .

Para ejecutar la die()función a través de RPC, primero debemos buscar la firma de la función. Esto se puede hacer a través de solc --hash:

 $ solc --hash greeter.sol

======= greeter.sol:greeter =======
Function signatures:
35f46994: die()
954ab4b2: say()

Ahora, todo lo que tenemos que hacer es crear una transacción para nuestro contrato de Greeter 0x1A3E28181B5043aC359B1146a8CCcce2a950212bcon la carga de datos 0x35f46994. Una llamada de autodestrucción generalmente no cuesta mucho, por lo tanto, solo asumimos una pequeña cantidad 0xc350.

curl --data '{"method":"eth_sendTransaction","params":[{"from":"0x00a329c0648769a73afac7f9381e08fb43dbea72",to:"0x1A3E28181B5043aC359B1146a8CCcce2a950212b","gas":"0xc350","data":"0x35f46994"}],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
{"jsonrpc":"2.0","result":"0x8423e6ed270f92621c14302f0d3db647eaf9677ef8f2ba0dd3374b79d2567c78","id":1}

Espero que esto responda directamente a tu pregunta. Prefiero el contrato de Greeter porque puede morir . Pero obtendrá la idea y puede adaptar esto para que su contrato HelloWorld funcione.