Wie rufe ich Funktionen von Smart Contract von einem Android-Telefon aus auf?

Ich habe einen Smart Contract mit Solidität zusammen mit einer GUI von Javascript und HTML bereitgestellt. Dieses Projekt funktioniert gut auf meinem Computer.

Jetzt möchte ich Funktionen von Smart Contract vom Android-Telefon aus aufrufen.

Gibt es dazu eine Möglichkeit? Und wenn ja, wie geht das?

Und muss ich auch meinen Smart Contract mit schreiben Java? oder Solidityversion ist ok ?

Mein solider Smart-Contract-Code:

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;
    }

}

Was ich tun möchte, ist, Funktionen meines Vertrags per Android-Telefon aufzurufen.

Hinweis : Ich habe mich angemeldet Infura, aber ehrlich gesagt weiß ich nicht , wie ich es auf meinem Android - Telefon verwenden soll , um Funktionen dieses Smart Contracts von meinem Android - Telefon aufzurufen ?

Antworten (5)

Zwei Dinge brauchen Sie dafür:

  1. Infura
  2. Web3js

Infura ermöglicht es Ihnen, sich mit dem Ethereum-Netzwerk zu verbinden (und ist kostenlos). Dann können Sie web3 verwenden, um mit Ihrem Vertrag zu interagieren.

Ich hoffe es hilft.

Danke schön. Ich habe mich angemeldet Infura, aber ehrlich gesagt weiß ich nicht, wie ich es auf meinem Android-Handy verwenden soll? Übrigens, die zweite Anforderung, die Sie in Ihrer Antwort erwähnt Web3jshaben, meinen Sie Web3joder Web3js? Danke.
Muss ich Infura auf meinem Android-Telefon installieren? Danke
Hier erfahren Sie, wie Sie mit infura und web3 beginnen (gehen Sie zum Beispiel zum Erstellen einer Website, die sich mit dem Ethereum-Netzwerk verbindet). Wenn ich Ihre Frage beantworte, akzeptieren Sie bitte die Antwort.
Web3j und Web3js sind beides praktikable Optionen, je nachdem, ob die App nativ oder HTML sein soll. Beachten Sie jedoch, dass Sie, wenn Ihre Benutzer Transaktionen durchführen können (anstatt nur schreibgeschützte Anrufe zu tätigen), ihre privaten Schlüssel in Ihrer App speichern müssen, was sie für Hacker viel attraktiver macht.

Wenn Sie fragen, wie Sie DApps von einem Android-Handy aus ausführen können, können Sie die Toshi - App laden. Es ist im Grunde ein Browser mit einer eingebauten Brieftasche und einem Ethereum-Knoten im Hintergrund und wird alle Ihre Webseiten basierend auf web3.js ausführen.

Danke schön. Ich habe HIER installiert . Ich weiß jedoch nicht, wie ich Funktionen meines Vertrags aufrufen kann, um eine Transaktion zu senden Toshi? Ich habe meiner Frage meinen Vertragsquellcode hinzugefügt. Danke.
Im Grunde genauso, wie Sie es auf Ihrem PC tun. Sie müssen Ihren Code nur irgendwo auf einem Server bereitstellen, um von Toshi aus darauf zugreifen zu können. Könnte ein Webserver auf Ihrem PC sein, wie zum Beispiel XAMPP.
Vielen Dank. Tatsächlich habe ich meinen Vertrag auf einem Linux-Server mit ip address : 18.221.104.179bereitgestellt. Ich weiß jedoch nicht, wie ich meinen Vertrag in Toshi finden kann. Danke noch einmal.
Geben Sie einfach die URL zu Ihrer HTML-Datei, die mit Ihrem Smart Contract verbunden ist, in das Feld „DApp-URL suchen oder eingeben“ ein. In Ihrem Fall sollte es also 18.221.104.179/<Ihre HTML-Datei> sein
Danke, aber wenn ich zu gehen möchte, 18.221.104.179erhalte ich einen 502 Bad Gateway -Screenshot , während ich ehrlich gesagt nicht genau verstanden habe, was Toshi tut? Ich meine, wenn wir eine index.htmlDatei auf einen Server hochladen, ist es nicht möglich, mit Smart Contract by Ex zu interagieren. google chrome Browser statt Toshi? Danke
Das klingt eher nach einem Serverproblem als nach etwas, das mit Ethereum zu tun hat. Toshi ist mehr oder weniger dasselbe wie Chrome mit Metamask. Es ermöglicht Ihnen, DApps einfach zu verwenden, ohne sich um Ethereum-Besonderheiten kümmern zu müssen
Danke schön. Und es ist nicht möglich, einen Vertrag zu testen, indem Toshider Vertrag noch nicht auf einen Server hochgeladen wurde, indem localhost? Danke.
@ gisdev_p In Bezug auf meinen Vertragscode in meiner Frage: Glauben Sie, dass es möglich ist, das folgende Szenario mit auszuführen Toshi? Danke1. 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 Meine letzte Frage: Im Falle der Verwendung von Toshi müssen wir kein Paket auf dem Android-Telefon installieren? Danke

Sie sollten sich web3j unter https://web3j.io/ ansehen. Sie haben eine Java-Bibliothek, die mit der Ethereum-Blockchain interagiert, ähnlich wie die JavaScript-Bibliothek web3.js. Es hat eine Android-Version sowie eine Vanilla-Java-Version.

Geth kann sowohl auf Android als auch auf iOS ausgeführt werden. Die nächtlichen Builds des Entwicklungszweigs enthalten immer die Android .aar-Archive, die Sie mit einem Android Studio-Projekt verknüpfen können, und das iOS-Framework, das Sie in XCode verwenden können.

Da Geth noch nicht über die Light-Client-Funktionalität verfügt (dass man tatsächlich globale P2P-Protokollaktualisierungen von Ethereum benötigt), ist es ziemlich schwergewichtig, aber es wird der offizielle Weg sein, mobile DApps auszuführen, und AFAIK nur Geth hat sogar ein entferntes Konzept für Light-Clients Unterstützung.

Weitere Informationen finden Sie unter dieser Frage.

Wenn Sie versuchen, sich von einer nativen mobilen Anwendung aus mit dem Ethereum-Netzwerk zu verbinden, sehen Sie sich dieses Geth-Tutorial für Android an. Dies ist ihr Github-Link .

Ich bin auch auf diese Bibliothek gestoßen, Ethereum Android , bin mir aber noch nicht sicher über ihre Fähigkeiten.

Eine dritte Option, die ich vielversprechend fand, ist Web3j .

Obwohl sie alle sehr vielversprechend aussehen und seit geraumer Zeit entwickelt werden, ist es ein wenig seltsam, dass es nicht genügend Tutorials und Dokumentationen über sie oder sogar Implementierungen in mobilen Apps gibt, die sich mit dem Ethereum-Netzwerk verbinden.

Ich verfolge auch das gleiche Ziel, also zögern Sie nicht, mich weiter zu kontaktieren.

Bearbeiten: Nach weiteren Recherchen und unter Bezugnahme auf Jaimes Antwort konnte ich die web3j-Bibliothek verwenden, um Java-Objekte meines Smart Contracts zu erstellen, vorausgesetzt, ich hatte den Quellcode und web3j verbindet mich auch mit dem Client, der in meinem Fall ein Infura-Client war Dies ist ein Link, den Sie erhalten, wenn Sie sich kostenlos bei Infura anmelden. Ich konnte Java-Objekte verwenden, die den Smart Contract darstellten, und seine Methoden aufrufen, die mit dem Ethereum-Hauptnetz (oder dem Testnetz, wenn Sie das möchten) interagierten.