Ich habe diesen Vertrag namens Registry
pragma solidity ^0.4.11;
contract Registry {
mapping(bytes32 => address) public ID;
mapping(address => address) public Contract;
function register(bytes32 _id) {
ID[_id] = tx.origin;
Contract[tx.origin] = msg.sender;
}
function getPublicAddress(bytes32 _id) constant returns (address) {
return (ID[_id]);
}
function getContractAddress(bytes32 _id) constant returns (address) {
return Contract[ID[_id]];
}
}
und ein anderer namens Benutzer
contract User {
address owner;
address reg;
Registry registry = Registry(reg);
// Register in the system
function register(bytes32 _id) {
registry.register(_id);
}
function getContractAddress(bytes32 _id) {
registry.getContractAddress(_id);
}
function getPublicAddress(bytes32 _id) {
registry.getPublicAddress(_id);
}
}
Die registry()
, getPublicAddress()
, und getContractAddress()
funktionieren nicht und ich kann nicht verstehen, warum.
Ich habe versucht, mit Truffle zu testen, bin aber auf einen bekannten Fehler gestoßen, der bis jetzt ungelöst ist. Ich habe hier danach gefragt , die Diskussion auf GitHub ist hier .
Ich habe versucht, es in meiner privaten Blockchain auszuführen, wo ich den folgenden Code habe
register: function(publicAddress, contractAddress, _id) {
// Getting that user's instance of the contract
const contract = contractInstance("User", contractAddress);
// Interaction with the contract
contract.register(web3.fromAscii(_id), {from: publicAddress}, (err, res) => {
// Log transaction to explore
if (err) {
console.log(err);
} else {
console.log('tx: ' + res);
helpers.addTransaction(publicAddress, res);
}
});
},
getContractAddress: function(contractAddress, _id) {
const contract = contractInstance("User", contractAddress);
contract.getContractAddress.call(web3.fromAscii(_id), (err, res) => {
if (err) {
console.log(err);
} else {
console.log(res);
}
})
},
getPublicAddress: function(contractAddress, _id) {
const contract = contractInstance("User", contractAddress);
contract.getPublicAddress.call(web3.fromAscii(_id), (err, res) => {
if (err) {
console.log(err);
} else {
console.log(res);
}
})
}
Nach der Registrierung (und dem Mining) melde ich mich einfach zurück
[]
beim Anruf getPublicAddress()
oder getContractAddress()
.
Kann jemand sehen, wo das Problem liegt?
Ihr Vertrag weist viele Fehler auf, wie folgt:
reg
params, es gibt keine Möglichkeit, es einzustellen. Der Standardwert von reg ist null, sodass der Register-Vertrag nicht aufgerufen wird, wenn Sie getPublicAddress
die Methode aufrufen.getPublicAddress
und getContractAddress
Methoden.Also habe ich Ihren Vertrag geändert und getestet, dass alles in Ordnung ist remix , Vertrag wie folgt:
pragma solidity ^0.4.11;
contract Registry {
mapping(bytes32 => address) public ID;
mapping(address => address) public Contract;
event log(bytes32,address);
function register(bytes32 _id) {
ID[_id] = tx.origin;
Contract[tx.origin] = msg.sender;
}
function getPublicAddress(bytes32 _id) constant returns (address) {
log(_id,ID[_id]);
return (ID[_id]);
}
function getContractAddress(bytes32 _id) constant returns (address) {
log(_id,Contract[ID[_id]]);
return Contract[ID[_id]];
}
}
contract User {
address owner;
Registry registry;
// Register in the system
function register(bytes32 _id) {
registry.register(_id);
}
function getContractAddress(bytes32 _id) constant returns (address){
return registry.getContractAddress(_id);
}
function getPublicAddress(bytes32 _id) constant returns (address) {
return registry.getPublicAddress(_id);
}
function setRegister(address _addr){
registry = Registry(_addr);
}
}
Zuerst sollten Sie den Register-Vertrag und dann den Benutzervertrag bereitstellen, jetzt die Register-Vertragsadresse kopieren, um die setRegister
Methode aufzurufen, zu minen und zu testen. Das Ergebnis ist
Hoffe es hilft~
Lee
bytes32
ParametergetPublicAddress
undgetContractAddress
Funktionen übergeben werden?