所以我正在为我的土木工程学位最后一年的项目制作一个 web3 应用程序
我初始化了我的 http 客户端
Client? httpClient;
Web3Client? ethClient;
@override
void initState(){
super.initState();
httpClient = Client();
ethClient = Web3Client(infura_url, httpClient!);
}
将我的所有功能输入到android studio中
Future<DeployedContract> loadContract ()async{
print('loading contract');
String abi = await rootBundle.loadString('Assets/abi.json');
String ContractAddress = contractAddress;
final contract = DeployedContract(ContractAbi.fromJson(abi, 'Login'), EthereumAddress.fromHex(ContractAddress));
return contract;
}
Future<String> Login(Web3Client ethClient, String _username, String _password)async{
DeployedContract contract = await loadContract();
print('contract loaded');
final response = await ethClient.call(contract: contract, function: contract.function('login'), params: [_username,_password],);
print(response);
return response[0] as String;
}
我的 flutter UI 代码从文本字段获取值并将其发送到合约,如下所示
onPressed: () {
String Utext = UserText.text;
String Upass = PassText.text;
print('a$Utext,b$Upass');
Login(ethClient!, Utext, Upass).then((String isLoggedin){
print(isLoggedin);
if(isLoggedin == 'yes'){
Navigator.push(context, MaterialPageRoute(builder: (context) => Client_init(),));
};
});
},
我的solidity代码的相关部分也在下面说明
function login(string memory _username, string memory _password) public view returns (string memory) {
User memory user = users[msg.sender];
string memory isLoggedin;
if(keccak256(abi.encodePacked(user.username)) == keccak256(abi.encodePacked(_username)) &&
keccak256(abi.encodePacked(user.password)) == keccak256(abi.encodePacked(_password))){
isLoggedin = "yes";
}
else{
isLoggedin = "no";
}
return isLoggedin;
}
现在,每当我在 flutter 应用程序的文本字段中输入正确的值并按登录时,我都会得到答案 [否],即使我应该得到 [是],这意味着我的应用程序能够访问此合约并对其进行解码,所以我的 abi 或 ethClient 初始化没有任何问题,我处理这个异步函数的方式也没有问题,对吧?那么为什么当我应该得到“是”时我仍然得到[否]作为答案。
另外,我的注册函数会抛出 32000 无效发件人错误,即使我使用我的个人密钥进行该交易,任何人都可以告诉我,我收到无效发件人错误的原因是什么?
请帮助睡眠不足的学生:,)
我想在我的 flutter 应用程序中输入名称和密码,并让应用程序从智能合约中验证它并给我一个 [yes] 的输出
在请求中包含 msg.sender (fromAddress)