Datos de entrada en Solidity

Estoy tratando de hacer algo simple como Hello World que se muestra en una página web. He escrito un contrato inteligente como este:

pragma solidity ^0.4.18;

contract HelloContract {
    string word = "Hello World!";

    function getWord() constant returns (string) {
        return word;
    }

    function setWord(string newWord) returns (string) {
        word = newWord;
        return word;
    }
}

y este el html:

<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>

        <link rel="stylesheet" type="text/css" href="main.css">

        <script src="./node_modules/web3/dist/web3.min.js"></script>

    </head>
        <body>
            <div class="container">
                <center>
                <label for="name" class="col-lg-2 control-label">Name:</label>
                <input id="name" type="text">

                <button id="button">Click!</button>

                <h1 id="word"></h1>

                </center>

            </div>

            <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>

                <script>
                    if (typeof web3 !== 'undefined') {
                    web3 = new Web3(web3.currentProvider);
                    } else {
                    // set the provider you want from the Web3.providers
                    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
                    }

                    web3.eth.defaultAccount = web3.eth.accounts[0];

                    var HelloContract = web3.eth.contract([
    {
        "constant": false,
        "inputs": [
            {
                "name": "newWord",
                "type": "string"
            }
        ],
        "name": "setWord",
        "outputs": [
            {
                "name": "",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": false,
                "name": "Word",
                "type": "string"
            }
        ],
        "name": "Word",
        "type": "event"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getWord",
        "outputs": [
            {
                "name": "",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
]);

            var Hello = HelloContract.at('0xd993de41f4979af7af48c2b5262afb41e63ff4c6');

            Hello.getWord(function(error, result){
                if(!error)
                {
                    $("#word").html('Hello ' + result[0]);
                } else 
                    console.log(error);
            });

            $("#button").click(function() {
                Hello.setWord($("#name").val());
            });
        </script>
    </body>
</html>

lo que estoy tratando de hacer es que los usuarios inserten su nombre (setWord) y mostrará "Hola (nombre de usuario)" (getWord) y todo esto que se ejecuta en blockchain significa que hay un txhash y cuando hago clic en él se mostrará "Hola (usuario)" en los datos de etherscan.

¿Cuál es tu pregunta?
con el código que he escrito, ¿es posible? y ¿cómo hago para que se ejecute en blockchain (ropsten)?

Respuestas (1)

Al llamar a la función setWord, debe especificar el límite de gas (costo de transacción que puede gastar para ejecutar) esa transacción y cuenta en particular de la cual se debe deducir ese costo de transacción en particular.

Hello.setWord($("#name").val(),{from: web3.eth.accounts[0], gas:3000000});

Como está especificando web3.eth.defaultAccount = web3.eth.accounts[0];que es la cuenta predeterminada desde la cual se ejecutarán todas las transacciones, no es necesario especificar, from: web3.eth.accounts[0]pero debe mencionar el límite de gas.

Después de hacer esto, podrá ejecutar setWord()transacciones getWord()con éxito. Me pregunto por qué está imprimiendo solo la primera letra ( result[0]) en getWord()función. Deberá imprimir el resultado completo, es decir result.

Adjunto aquí el código completo que puedo ejecutar. Debe actualizar la página para ver la palabra modificada.

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <!-- <link rel="stylesheet" type="text/css" href="main.css"> -->

    <!-- <script src="./node_modules/web3/dist/web3.min.js"></script> -->

</head>
    <body>
        <div class="container">
            <center>
            <label for="name" class="col-lg-2 control-label">Name:</label>
            <input id="name" type="text">

            <button id="button">Click!</button>

            <h1 id="word"></h1>

            </center>

        </div>

        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
        <script src="https://cdn.rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script>

            <script>
                Web3 = require('web3');
                web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));

                web3.eth.defaultAccount = web3.eth.accounts[0];

                var HelloContract = web3.eth.contract([
{
    "constant": false,
    "inputs": [
        {
            "name": "newWord",
            "type": "string"
        }
    ],
    "name": "setWord",
    "outputs": [
        {
            "name": "",
            "type": "string"
        }
    ],
    "payable": false,
    "stateMutability": "nonpayable",
    "type": "function"
},
{
    "anonymous": false,
    "inputs": [
        {
            "indexed": false,
            "name": "Word",
            "type": "string"
        }
    ],
    "name": "Word",
    "type": "event"
},
{
    "constant": true,
    "inputs": [],
    "name": "getWord",
    "outputs": [
        {
            "name": "",
            "type": "string"
        }
    ],
    "payable": false,
    "stateMutability": "view",
    "type": "function"
}
]);

        var Hello = HelloContract.at('0x178cae4d338a7c3ea5fcf8727bac04b5df925607');

        Hello.getWord(function(error, result){
            if(!error)
            {
                $("#word").html('Hello ' + result);
            } else 
                console.log(error);
        });
        console.log("Word :"+$("#name").val());
        $("#button").click(function() {
            Hello.setWord($("#name").val(),{from: web3.eth.accounts[0], gas:3000000});
        });
    </script>
</body>

Oh gracias. casi llego. una cosa más, inserto mi nombre, pero no aparece. solo "hola". y ¿cómo verifico si ya está en etherscan? buscar la dirección?
Haga clic con el botón derecho en el navegador web y haga clic en inspeccionar, abra una pestaña de la consola y vea si obtiene algunos errores al ejecutar el código de script de Java. Estoy usando ganache, que es otro cliente de ethereum Hello.getWord() me da una palabra actualizada en la consola. ¡Espero que esto ayude!
Hice. ese es el problema, no me sale ningún error. como puede ver, inserto el nombre, pero el nombre no se muestra pero tampoco tiene ningún error. imgur.com/a/x80hmxS
Puedo ejecutarlo por mi parte y todavía no puedo averiguar qué problema está enfrentando. Le recomiendo que intente ejecutar el mismo código de script Java en el cliente ethereum (geth o ganache) y descubra cuál es el problema.
imgur.com/a/qZHmZzb gracias. hay un txhash pero cuando lo busco en etherscan, no sale nada.
Hay dos tipos de red blockchain 1) Red pública ethereum blockchain y 2) Red privada ethereum blcockchain De acuerdo con este etherscan, no se puede usar como explorador para la red privada blockchain. ethereum.stackexchange.com/questions/27564/… Entonces, si busca el hash de su transacción en una cadena de bloques pública, no podrá verlo mientras crea una transacción en su propia red de cadena de bloques privada. Le recomiendo que use ganache, que es un cliente basado en la interfaz de usuario en el que puede explorar bloques y transacciones.
Sé que arruinará la cadena de bloques, pero esta es una tarea y solo necesito saber si funciona. si tiene datos en blockchain, en solidez y no en html. lo siento y gracias
Como puede ejecutar Hello.getWord() en el cliente ganache, eso significa que los datos se almacenan en blockchain. Debe averiguar por qué no puede verlo usando la página web. Puedo verlo imgur.com/JQNyp9K