Dieser Vertrag sollte die Adresse des Absenders zurückgeben:
contract SimpleExample {
function getSender() constant returns (address) {
return msg.sender;
}
}
Das folgende Javascript ruft diesen Vertrag auf:
var abi = [{"constant":true,"inputs":[],"name":"getSender","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
var MyContract = web3.eth.contract(abi);
var myContractInstance = MyContract.at('0x46E286cb00c5e7D5949D18e767447E513d001BBA');
myContractInstance.getSender.call(function(error, result){
if(!error) {
console.log("##" + result + "##")
} else {
console.error("Error:" + error);
}
})
Anstatt die Adresse des Absenders zurückzugeben, wird 0x000000000000000000000000000000000000000 zurückgegeben.
Derzeit gibt es 3 Möglichkeiten, eine Vertragsfunktion in web3 "aufzurufen".
myContractInstance.foo.call()
, wodurch web3 den Vertragscode lokal ausführt (da der Bytecode für alle Blockchain-Teilnehmer sichtbar ist). Es gibt Ihnen den Rückgabewert zurück, indem es die Funktion lokal ausführt . Es erstellt keine TX, sendet nichts an das Netzwerk. Es gibt keine Nachricht.myContractInstance.foo.sendTransaction()
, wodurch web3 einen tx sendet, um die Funktion aufzurufen. Es gibt Ihnen einen tx-Hash zurück . Sie müssen für Benzin bezahlen, warten, bis der TX abgebaut ist, dann erhalten Sie Ihre TX-Quittung. Beachten Sie, dass Sie auf diese Weise nicht den Rückgabewert der Funktion erhalten, da sie nicht in der TX-Quittung enthalten sind. Protokolle sind jedoch in der tx-Quittung.myContractInstance.foo()
. Wenn Ihre Funktion lautet constant
, verwendet web3 .call
. Wenn es nicht konstant ist, wird es verwendet.sendTransaction
Damit das Beispiel in einem Web3-Client funktioniert, müssen Sie
.sendTransaction
).call
sich in Ihrem Client befinden. (Sie können es hier nicht tun, wenn Sie .call
dann kein msg
)Modifiziertes Beispiel
contract SimpleExample {
event LogSender(address sender);
function getSender() returns (address) {
LogSender(msg.sender);
return msg.sender;
}
}
Jetzt in web3 würden Sie es wie nennen
// replace from with the account you want to send the tx from
const txHash = myContractInstance.getSender({ from: "xxxxxxxx" });
// once the tx has been mined, get the tx receipt
web3.eth.getTransactionReceipt(txHash, (err, receipt) => {
console.log(receipt.logs[0].args.sender); // you will see sender address here
}
Wenn Sie nur den Ersteller des Vertrags erhalten möchten, ohne Benzin auszugeben, ist dies ziemlich einfach.
Sie erstellen eine Zustandsvariable mit dem Namen owner
, machen sie öffentlich. Legen Sie die owner
im Konstruktor fest.
contract SimpleExample {
address public owner;
function SimpleExample() {
owner = msg.sender;
}
}
Solidity erstellt automatisch konstante Getter-Funktionen für öffentliche Zustandsvariablen. (Obwohl Sie es auch explizit tun können)
Denn die Vertragsspeicherung ist neben dem Bytecode auch für alle Beteiligten einsehbar. In web3 können Sie owner
ähnliches erhalten
const ownerAddress = myContractInstance.owner()
Was in diesem Fall, da der Getter konstant ist, gleichbedeutend ist
const ownerAddress = myContractInstance.owner.call()
myContractInstance.owner() === userAddress
? Sie können Benutzerkonten in abrufen web3.eth.accounts
.web3.eth.accounts
auf Ihrer Client-Seite überprüfen. Niemand kann feststellen, wer die Funktion außerhalb des Netzwerks aufgerufen hat. Tatsächlich benötigen Sie nicht einmal ein Konto, um die konstante Funktion aufzurufen
libertylocked
.call
erstellt keine Transaktion. Es ruft die Funktion lokal auf dem Client auf. Es gibt keinmsg
libertylocked
getSender
ist eine konstante Funktion. Standardmäßig erstellt web3 keine Transaktion zum Aufrufen einer konstanten Funktion. Sie entfernen entweder dasconstant
Schlüsselwort oder rufen.getSender.sendTransaction
an, um web3 zu zwingen, eine TX zu senden. Außerdem erhalten Sie immer noch nicht den Rückgabewert von einer tx-Quittung. Sie sehen nur Ereignisprotokolle, wenn Sie welche habenPrüfer
libertylocked
libertylocked
public
dann wiemyContractInstance.creator()
Prüfer