есть небольшое приложение для голосования за кандидата с использованием смарт-контрактов:
spoilerpackage 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()
}
}
}
код смарт-контракта:
spoilerpragma 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", и я не могу понять род этой ошибки. вроде имя кандидата в поле ввожу, на кнопку нажимаю, адреса и ключи правильные использую. помогите разобраться, пожалуйста