¿Cómo invocar las funciones de Smart Contract desde un teléfono Android?

Implementé un contrato inteligente con solidez junto con una GUI de Javascript y HTML. Este proyecto funciona bien en mi computadora.

Ahora quiero invocar las funciones de Smart Contract desde un teléfono Android.

¿Hay alguna posibilidad de hacer esto? Y si es así, ¿cómo hacer?

¿Y también necesito escribir mi contrato inteligente con Java? o Solidityla versión está bien?

Mi código de contrato inteligente de solidez:

pragma solidity 0.4.23; 

contract RFID {

    struct StateStruct {
        bytes32 description;
        mapping(bytes32 => bytes32) sub_state;
    }

    struct ObjectStruct {
        StateStruct state;
        address owner; 
        bool isObject;

        bytes32 review;
    }

    mapping(bytes32 => ObjectStruct) objectStructs;
    bytes32[] public objectList;

    event LogNewObject(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values, address owner);
    event LogChangeObjectState(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values);
    event LogChangeObjectOwner(address sender, bytes32 indexed id, address newOwner);

    event LogNewObjectReview(address sender, bytes32 indexed _id, bytes32 _review,  address _owner);
    event LogChangeObjectStateReview(address sender, bytes32 indexed id, bytes32 _review);

    function isObject(bytes32 _id) public view returns(bool isIndeed) {
        return objectStructs[_id].isObject;
    }

    function getObjectCount() public view returns(uint count) {
        return objectList.length;
    }

    /*function setArraySize(uint256 _number_of_sub_states) public {

        number_of_sub_states = _number_of_sub_states;

    }

    function getArraySize() view public returns (uint256) {
       return number_of_sub_states;
    }*/

    function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner) public returns(bool success) {
        require(!isObject(_id));

        uint256 counter=0;
        for(counter; counter < number_of_sub_states; counter++) {

            objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];

            emit LogNewObject(msg.sender, _id, bytes32(sub_states_types[counter]), bytes32(sub_states_values[counter]), _owner);

        }

        objectStructs[_id].owner = _owner;
        objectStructs[_id].isObject = true;

        objectList.push(_id);

        return true;
    }

    function newObjectReview(bytes32 _id, bytes32 _review,  address _owner) public returns(bool success) {
        require(!isObject(_id));

        objectStructs[_id].owner = _owner;
        objectStructs[_id].isObject = true;

        objectStructs[_id].review = _review;

        emit LogNewObjectReview(msg.sender, _id, _review, _owner);

        objectList.push(_id);

        return true;
    }

    function changeObjectState(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values) public returns(bool success) {
        require(isObject(_id));
        uint256 counter=0;
        for(counter; counter < number_of_sub_states; counter++) {

            objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];

            emit LogChangeObjectState(msg.sender, _id, bytes32(sub_states_types[counter]), bytes32(sub_states_values[counter]));

        }

        return true;
    }

    function changeObjectStateReview(bytes32 _id, bytes32 _review) public returns(bool success) {
        require(isObject(_id));

        objectStructs[_id].review = _review;

        emit LogChangeObjectStateReview(msg.sender, _id, _review);

        return true;
    }

    function changeObjectOwner(bytes32 _id, address _newOwner) public returns(bool success) {
        require(isObject(_id));
        objectStructs[_id].owner = _newOwner;
        emit LogChangeObjectOwner(msg.sender, _id, _newOwner);
        return true;
    }

}

Lo que quiero hacer es invocar funciones de mi contrato por teléfono android.

Nota: Me registré Infura, sin embargo, sinceramente, no sé cómo usarlo en mi teléfono Android para invocar las funciones de este contrato inteligente desde mi teléfono Android.

Respuestas (5)

Dos cosas que necesitas para esto:

  1. Infura
  2. web3js

Infura te permitirá conectarte a la red ethereum (y es gratis). Luego puede usar web3 para interactuar con su contrato.

Espero eso ayude.

Gracias. Me registré Infura, sin embargo, sinceramente, no sé cómo usarlo en mi teléfono Android. Por cierto, el segundo requisito que mencionaste en tu respuesta Web3js, ¿te refieres a Web3jWeb3js? Gracias.
¿Necesito instalar Infura en mi teléfono Android? Gracias
Aquí puede encontrar cómo comenzar con infura y web3 (vaya al ejemplo de creación de un sitio web que se conecta a la red ethereum). Si respondo a su pregunta, por favor acepte la respuesta.
Web3j y Web3js son opciones viables, dependiendo de si desea que la aplicación sea nativa o HTML. Pero tenga en cuenta que si sus usuarios pueden realizar transacciones (en lugar de solo realizar llamadas de solo lectura), deberá almacenar sus claves privadas en su aplicación, lo que la hace mucho más atractiva para los piratas informáticos.

Si está preguntando cómo ejecutar DApps desde un dispositivo móvil Android, puede cargar la aplicación Toshi . Básicamente es un navegador con una billetera integrada y un nodo Ethereum en la parte posterior y ejecutará todas sus páginas web basadas en web3.js.

Gracias. Instalé Toshidesde AQUÍ Sin embargo, no sé cómo puedo invocar las funciones de mi contrato para enviar una transacción. Agregué el código fuente de mi contrato a mi pregunta. Gracias.
Básicamente de la misma manera que lo haces en tu PC. Solo necesita implementar su código en algún lugar de un servidor para acceder a él desde Toshi. Podría ser un servidor web en su PC, como XAMPP, por ejemplo.
Gracias. De hecho, implementé mi contrato en un servidor Linux con ip address : 18.221.104.179. Sin embargo, no sé cómo encontrar mi contrato en Toshi. Gracias de nuevo.
Simplemente ingrese la URL de su archivo HTML que interactúa con su contrato inteligente en el campo que dice "Buscar o ingresar URL de DApp". Entonces, en su caso, debería ser 18.221.104.179/<su archivo HTML>
Gracias, pero cuando quiero ir a 18.221.104.179recibo 502 captura de pantalla de puerta de enlace incorrecta mientras tanto, sinceramente, no entendí exactamente qué hace Toshi. Quiero decir, cuando cargamos un index.htmlarchivo en un servidor, no es posible interactuar con un contrato inteligente por ej. google chrome navegador en lugar de Toshi? Gracias
Eso suena más como un problema del servidor, en lugar de algo relacionado con Ethereum. Toshi es más o menos lo mismo que Chrome con Metamask. Le permite usar DApps fácilmente sin tener que preocuparse por los detalles de Ethereum
Gracias. ¿Y no es posible probar un contrato de Toshital manera que el contrato aún no se haya cargado en un servidor usando localhost? Gracias.
@ gisdev_p Con respecto a mi código de contrato en mi pregunta, ¿cree que es posible hacer el siguiente escenario usando Toshi? Gracias1. Uploading GUI web application of RFID/NFC smart contract on server. 2. Finding this Dapp in Toshi browser : http://www.toshi.org/ on android phone. 3. Create new object by smart contract with some review. 4. Getting Tx hash and copy to NFC app. 5. Write Tx hash on NCF tag.
@gilded_p mi última pregunta: en caso de usar Toshi, ¿no necesitamos instalar ningún paquete en el teléfono Android? Gracias

Debe consultar web3j en https://web3j.io/ Tienen una biblioteca Java que interactúa con la cadena de bloques Ethereum similar a la biblioteca JavaScript web3.js. Tiene una versión de Android, así como una versión vainilla de Java.

Geth se puede ejecutar tanto en Android como en iOS. Las compilaciones nocturnas de la rama de desarrollo siempre incluyen los archivos .aar de Android que puede vincular con un proyecto de Android Studio y el marco de iOS que puede usar en XCode.

Dado que Geth aún no presenta la funcionalidad de cliente ligero (que en realidad necesita actualizaciones del protocolo P2P global de Ethereum), es bastante pesado, pero será la forma oficial de ejecutar DApps móviles, y AFAIK solo Geth tiene incluso un concepto remoto sobre cliente ligero apoyo.

Se puede encontrar más información en esta pregunta.

Si está intentando conectarse a la red Ethereum desde una aplicación móvil nativa, consulte este tutorial de Geth para Android. Este es su enlace de Github .

También encontré esta biblioteca, Ethereum Android , pero aún no estoy seguro de sus capacidades.

Una tercera opción que encontré prometedora es Web3j .

Aunque todos parecen muy prometedores y se han desarrollado durante bastante tiempo, es un poco extraño que no haya suficientes tutoriales y documentación sobre ellos o incluso implementaciones en aplicaciones móviles que se conectan a la red Ethereum.

También estoy persiguiendo el mismo objetivo, así que no dude en ponerse en contacto conmigo más.

Editar: Entonces, después de investigar más y referirme a la respuesta de Jaime , pude usar la biblioteca web3j para crear objetos Java de mi contrato inteligente siempre que tuviera el código fuente y web3j también me conecta con el cliente, que en mi caso era un cliente Infura que es un enlace que obtienes cuando te registras en Infura de forma gratuita. Pude usar objetos Java, que representaban el contrato inteligente, e invocar sus métodos que interactuaban con la red principal de Ethereum (o la red de prueba, si eso es lo que desea).