В основном мой вариант использования - создать регистрационную форму и связать ее с блокчейном. Пока что у меня есть контракт, работающий в Remix (скомпилированный с версией 0.4.25), однако, когда я иду и пытаюсь передать данные в блокчейн с использованиемactJS, он выдает ошибку
Ошибка узла: {"message": "Невозможно прочитать свойство 'из' of null" ...}
Может ли кто-нибудь помочь мне?
App.js:
onsaveInfo = async (event) =>{
/*var data={
fname:this.state.fname,
lname:this.state.lname,
phone:this.state.phno
}*/
console.log("final data-----",this.state._fname,this.state._lname,this.state._phno);
localStorage.setItem('data',this.state._fname,this.state._lname,this.state._phno);
console.log("1------------",getWeb3);
// getWeb3.then(results=>{
// let web3 = results.payload.web3Instance;
// var callingAddress= web3.currentProvider['publicConfigStore'].getState().selectedAddress;
// console.log("2-----------------",callingAddress);
// })
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
console.log("current provider ------",web3.eth.givenProvider.selectedAddress);
// web3.eth.getAccounts(console.log);
//alert("qwertyuiop");
const contractInstance = new web3.eth.Contract(this.state.contractAbi,this.state.contractAddress);
console.log(contractInstance);
await contractInstance.methods.createRandomUser(this.state._fname,this.state._lname,this.state._phno).call(function(error,result){
if(!error){
console.log("result========",result);
}
});
}
render() {
if (!this.state.web3) {
return <div>Loading Web3, accounts, and contract...</div>;
}
return (
<div className="App">
<div className="col-md-12">
<div className="card">
<label>First Name : </label>
<input type="text" placeholder="firstName" onChange={(event)=>this.setState({_fname:event.target.value})}/>
<br></br>
<label>Last Name : </label>
<input type="text" placeholder="lastName" onChange={(event)=>this.setState({_lname:event.target.value})}/>
<br></br>
</div>
<label>Ph No : </label>
<input type="text" placeholder="phNo" onChange={(event)=>this.setState({_phno:event.target.value})}/>
<br></br>
<label>Role : </label>
<select>
<option >Select</option>
<option value="Driver1" onClick={event=>this.setState({roleName:event.target.value})}>Driver1</option>
<option value="Driver2" onClick={event=>this.setState({roleName:event.target.value})}>Driver2</option>
<option value="Driver3" onClick={event=>this.setState({roleName:event.target.value})}>Driver3</option>
</select>
<br></br>
</div>
<div>
<input type="button" onClick={event=>this.onsaveInfo(event)} value='Save Info'/>
</div>
</div>
);
Договор написан:
pragma solidity ^0.4.25;
contract ambFactory {
struct User {
string _fname;
string _lname;
uint _phno;
}
uint phDigits = 10;
uint phModulus = 10 ** phDigits;
User[] public users;
function _setProfile(string _fname, string _lname, uint _phno) private {
users.push(User(_fname, _lname, _phno));
}
/*function _genRandomUser(string _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % phModulus;
}*/
function createRandomUser(string _fname, string _lname, uint _phno) public {
//uint randNo = _genRandomUser(_fname);
_setProfile(_fname, _lname, _phno);
}
}
Я ожидал, что информация будет отправлена в локальную блокчейн, которую я настроил, и транзакция будет отражена в MetaMask (провайдер, которого я использую), однако такое окно подтверждения транзакции не появляется, и ошибка получена.