Как вызвать функции смарт-контракта с телефона Android?

Я развернул надежный смарт-контракт вместе с графическим интерфейсом с помощью Javascript и HTML. Этот проект хорошо работает на моем компьютере.

Теперь я хочу вызвать функции смарт-контракта с телефона Android.

Есть ли возможность это сделать? И если да, то как сделать?

А также нужно ли мне писать смарт-контракт с Java? или Solidityверсия подходит?

Код моего смарт-контракта солидности:

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

}

Что я хочу сделать, так это вызвать функции моего контракта на телефоне Android.

Примечание. Я зарегистрировался Infura, однако, честно говоря, я не знаю, как использовать его на моем телефоне Android, чтобы вызывать функции этого смарт-контракта с моего телефона Android?

Ответы (5)

Для этого вам понадобятся две вещи:

  1. Инфура
  2. Web3js

Infura позволит вам подключиться к сети ethereum (бесплатно). Затем вы можете использовать web3 для взаимодействия с вашим контрактом.

Надеюсь, поможет.

Спасибо. Я подписался на Infura, но, честно говоря, я не знаю, как использовать его на моем телефоне Android? Кстати, второе требование, которое вы упомянули в своем ответе Web3js, вы имеете в виду Web3jили Web3js? Спасибо.
Нужно ли устанавливать Infura на мой телефон Android? Спасибо
Здесь вы можете узнать, как начать работу с infura и web3 (перейдите к примеру создания веб-сайта, который подключается к сети ethereum). Если я отвечу на ваш вопрос, пожалуйста, примите ответ.
Web3j и Web3js являются жизнеспособными вариантами, в зависимости от того, хотите ли вы, чтобы приложение было родным или HTML. Но имейте в виду, что если ваши пользователи могут совершать транзакции (а не просто совершать звонки только для чтения), вам нужно будет хранить их закрытые ключи в своем приложении, что делает его гораздо более привлекательным для хакеров.

Если вы спрашиваете, как запускать DApps с мобильного устройства Android, вы можете загрузить приложение Toshi . По сути, это браузер со встроенным кошельком и узлом Ethereum, который будет запускать все ваши веб-страницы на основе web3.js.

Спасибо. Я установил ЗДЕСЬ Однако я не знаю, как я могу вызвать функции моего контракта для отправки транзакции Toshi? Я добавил исходный код контракта к своему вопросу. Спасибо.
В основном так же, как вы делаете это на своем ПК. Вам просто нужно развернуть свой код где-нибудь на сервере, чтобы получить к нему доступ из Toshi. Это может быть веб-сервер на вашем ПК, например, XAMPP.
Спасибо. На самом деле я развернул свой контракт на Linux-сервере с . ip address : 18.221.104.179Однако я не знаю, как найти свой контракт в Toshi? Еще раз спасибо.
Просто введите URL-адрес вашего HTML-файла, который взаимодействует с вашим смарт-контрактом, в поле с надписью «Поиск или введите URL-адрес DApp». Так что в вашем случае это должно быть 18.221.104.179/<ваш файл HTML>
Спасибо, но когда я хочу пойти, 18.221.104.179я получаю снимок экрана с ошибкой 502, в то время как я, честно говоря, не совсем понял, что делает Тоши? Я имею в виду, когда мы загружаем index.htmlфайл на сервер, невозможно взаимодействовать со смарт-контрактом ex. google chrome браузер вместо Toshi? Спасибо
Это больше похоже на проблему с сервером, чем на что-то, связанное с Ethereum. Toshi более или менее похож на Chrome с Metamask. Это позволяет вам легко использовать DApps, не заботясь о многих особенностях Ethereum.
Спасибо. И невозможно протестировать контракт Toshiтаким образом, что контракт еще не загружен на сервер с помощью localhost? Спасибо.
@ gisdev_p Что касается моего кода контракта в моем вопросе, как вы думаете, можно ли выполнить следующий сценарий, используя Toshi? Спасибо1. 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 мой последний вопрос: в случае использования Toshi нам не нужно устанавливать какой-либо пакет на телефон Android? Спасибо

Вы должны изучить web3j по адресу https://web3j.io/ . У них есть библиотека Java, которая взаимодействует с блокчейном Ethereum, подобно библиотеке JavaScript web3.js. Он имеет версию для Android, а также ванильную версию для Java.

Geth можно запустить как на Android, так и на iOS. Ночные сборки ветки разработки всегда включают архивы Android .aar, которые можно связать с проектом Android Studio, и платформу iOS, которую можно использовать в XCode.

Поскольку Geth еще не имеет функциональности легкого клиента (который на самом деле требует обновления глобального P2P-протокола Ethereum), он довольно тяжелый, но это будет официальный способ запуска мобильных DApp, и, насколько мне известно, только у Geth есть даже отдаленное представление о легком клиенте. поддерживать.

Дополнительную информацию можно найти в этом вопросе.

Если вы пытаетесь подключиться к сети Ethereum из собственного мобильного приложения, ознакомьтесь с этим учебным пособием Geth для Android. Это их ссылка на Github .

Я также сталкивался с этой библиотекой, Ethereum Android , но пока не уверен в ее возможностях.

Третий вариант, который мне показался многообещающим, — это Web3j .

Несмотря на то, что все они выглядят очень многообещающе и над ними велась разработка в течение достаточно долгого времени, немного странно, что по ним недостаточно руководств и документации или даже реализаций в мобильных приложениях, которые подключаются к сети Ethereum.

Я также преследую ту же цель, поэтому не стесняйтесь обращаться ко мне дальше.

Изменить: Итак, после дальнейших исследований и обращения к ответу Хайме я смог использовать библиотеку web3j для создания объектов Java моего смарт-контракта при условии, что у меня есть исходный код, а web3j также подключает меня к клиенту, который в моем случае был клиентом Infura. это ссылка, которую вы получаете, когда бесплатно регистрируетесь в Infura. Я смог использовать объекты Java, которые представляли смарт-контракт, и вызывать его методы, которые взаимодействовали с основной сетью Ethereum (или с тестовой сетью, если хотите).