kan3k1k3n
@kan3k1k3n

Появляется ошибка «null» при попытке задеплоить смарт-контракт. Как исправить?

есть небольшое приложение для голосования за кандидата с использованием смарт-контрактов:
spoiler
package my.first.app

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.activity.ComponentActivity
import org.web3j.crypto.Credentials
import org.web3j.protocol.Web3j
import org.web3j.protocol.http.HttpService
import org.web3j.tx.gas.ContractGasProvider
import org.web3j.tx.gas.StaticGasProvider
import java.math.BigInteger

class MainActivity : ComponentActivity() {
    private var web3j: Web3j? = null
    private var election: Election? = null
    private var credentials: Credentials? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val voteButton: Button = findViewById(R.id.btn_vote)

        web3j = Web3j.build(HttpService("http://127.0.0.1:7545")) 

        try {
            credentials = Credentials.create("адрес")
        } catch (e: Exception) {
            e.printStackTrace()
        }

        val gasProvider: ContractGasProvider =
            StaticGasProvider(BigInteger.valueOf(20000000000L), BigInteger.valueOf(6721975L))
        election = Election.load("адрес", web3j, credentials, gasProvider)

        voteButton.setOnClickListener {
            vote(1)
        }
    }

    private fun vote(candidateId: Int) {
        try {
            val receipt = election!!.vote(BigInteger.valueOf(candidateId.toLong())).send()
            Toast.makeText(this, "голосование прошло успешно!", Toast.LENGTH_SHORT).show()

        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(this, "ошибка:" + e.message, Toast.LENGTH_SHORT).show()
        }
    }
}


код смарт-контракта:
spoiler
pragma solidity ^0.8.27;

contract Election {
    struct Candidate {
        uint id;
        string name;
        uint voteCount;
    }

    mapping(uint => Candidate) public candidates;
    mapping(address => bool) public voters;
    uint public candidatesCount;

    event Voted(address indexed voter, uint indexed candidateId);

    constructor() {
        addCandidate("Bobby");
        addCandidate("John");
        addCandidate("Mark");
    }

    function addCandidate(string memory _name) private {
        candidatesCount++;
        candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);
    }

    function vote(uint _candidateId) public {
        require(!voters[msg.sender], "You have already voted.");
        require(_candidateId > 0 && _candidateId <= candidatesCount, "Invalid candidate ID.");

        voters[msg.sender] = true;
        candidates[_candidateId].voteCount++;

        emit Voted(msg.sender, _candidateId);
    }
}


код основной активности приложения:
spoiler
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/et_candidate_name"
        android:layout_width="427dp"
        android:layout_height="88dp"
        android:hint="Введите имя кандидата" />

    <Button
        android:id="@+id/btn_vote"
        style="@android:style/Widget.Button"
        android:layout_width="386dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="проголосовать"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="342dp"
        android:layout_height="64dp"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="Результаты голосования:"
        android:textColor="#000000"
        android:textColorLink="#D80D0D"
        android:textSize="20sp" />
</LinearLayout>


суть вопроса: при нажатии в приложении на кнопку "проголосовать" появляется ошибка "null", и я не могу понять род этой ошибки. вроде имя кандидата в поле ввожу, на кнопку нажимаю, адреса и ключи правильные использую. помогите разобраться, пожалуйста
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы