Ich schreibe einen einfachen Vertrag, der im Grunde eine Registrierung ist. Ich verwende testRPC für meine Ethereum-Tests. Das Folgende ist mein Vertrag auf Truffle:
notar.sol
pragma solidity ^0.4.11;
contract notary {
struct individual {
bytes32 firstname;
bytes32 lastname;
uint yob;
bytes32 pancard;
uint aadhar;
}
mapping(address => individual) public user;
function Register(address _to, bytes32 _firstname, bytes32 _lastname, uint _yob, bytes32 _pancard, uint _aadhar) returns (bool success) {
if (user[_to].aadhar != 0) {
return false;
}
user[_to].firstname = _firstname;
user[_to].lastname = _lastname;
user[_to].yob = _yob;
user[_to].pancard = _pancard;
user[_to].aadhar = _aadhar;
return true;
}
function getDetails(address _to) constant returns (bytes32 _firstname, bytes32 _lastname, uint _yob, bytes32 _pancard, uint _aadhar) {
return (user[_to].firstname, user[_to].lastname, user[_to].yob, user[_to].pancard, user[_to].aadhar);
}
}
Wenn ich den Vertrag bereitgestellt habe, truffle compile and truffle migrate --reset
funktioniert alles wie vorgesehen. Ich habe bereits einen Eintrag zum Vertrag gemacht:
Aktion über Konsole
> notary.deployed().then(function(instance) {NOTR = notary.deployed.at(instance.address)})
> NOTR.Register(web3.eth.accounts[9], 'mukesh', 'kumar', 1987, 'fbjsdkfd67', 324234)
> NOTR.getDetails(web3.eth.accounts[9])
[ '0x6d756b6573680000000000000000000000000000000000000000000000000000',
'0x6b756d6172000000000000000000000000000000000000000000000000000000',
{ [String: '1987'] s: 1, e: 3, c: [ 1987 ] },
'0x66626a73646b6664363700000000000000000000000000000000000000000000',
{ [String: '324234'] s: 1, e: 5, c: [ 324234 ] } ]
Als nächstes versuche ich, dies mit React als Schnittstelle zu erreichen. Mein React-Code ist länger, als ich hier einfügen möchte. Hauptsächlich ist die Schnittstelle einfach wie folgt:
Wenn ich auf Senden klicke, möchte ich im Grunde eine neue Registrierung erstellen. Ich habe ABI, Vertragsadresse und andere Parameter wie erforderlich in meiner React-App angegeben, zusätzlich zu allen darin erforderlichen ordnungsgemäßen Importen usw. Tatsächlich funktionieren die folgenden tatsächlich auf meiner React-Oberfläche:
handleSubmit(event) {
// alert(notaryContract.getDetails(ETHEREUM_CLIENT.eth.accounts[9]))
// alert(JSON.stringify(this.state))
// alert(ETHEREUM_CLIENT.isAddress(ETHEREUM_CLIENT.eth.accounts[0]))
Aber sobald ich notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar)
es versuche, bekomme ich einen Fehler wie folgt (die _to
enthaltene Adresse ist eine der testrpc-Adressen:
Uncaught Error: invalid address
at inputAddressFormatter (http://localhost:3000/static/js/bundle.js:59056:11)
at inputTransactionFormatter (http://localhost:3000/static/js/bundle.js:34345:27)
...long list...
at dispatchEvent (http://localhost:3000/static/js/bundle.js:31505:20)
Entschuldigung für eine lange Frage, aber ich bin sicher, dass mir hier etwas Kleines fehlt, und ich musste die Reproduktion Schritt für Schritt hinzufügen, damit andere auf das Problem hinweisen können. Ich habe versucht, die Adresse in Zeichenfolgenform einzugeben und dann auch einfach web3.eth.accounts[x]
die [_to]
Adresse einzufügen, aber ohne Erfolg. Ich denke möglicherweise, weil getDetails
es eine konstante Funktion ist, die funktioniert, da es kein Gas verbraucht, während Register
keine Transaktion erstellt und eine Zustandsänderung verursacht wird. Ich kann jedoch nicht nachvollziehen, warum es truffle console
in der React-App funktioniert, während es nicht funktioniert. Ich habe die bundle.js überprüft, aus der der Fehler wegen ungültiger Adresse stammt, aber da es noch keine richtigen Debugging-Protokolle gibt, um die Probleme zu verstehen, kann ich sie nicht zum Laufen bringen. Jede Hilfe wird sehr geschätzt.
Jeder Transaktion sollte eine Kontoadresse zugeordnet sein. Bei der Verwendung der Truffle-Konsole wird automatisch das Standardkonto verwendet, jedoch nicht bei der Verwendung von web3.
Versuchen Sie, Ihrer Transaktion eine Kontoadresse wie unten zuzuordnen:
notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar, {from: eth.accounts[0]})
oder
notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar, {from: <your account address>})
Mangan
Mangan
Abhishek
Mangan
Abhishek
Mangan
Mangan
Abhishek
Mangan