Ich habe ein seltsames Problem mit Solidity und web3.js 1.0. Jede Hilfe wäre sehr willkommen.
Hier ist mein Solidity-Code:
pragma solidity ^0.4.16;
contract Test {
address public contractOwner;
function TestContract() public {
contractOwner = msg.sender;
}
function foo() constant returns(address) {
return msg.sender;
}
}
Der Aufruf der automatisch generierten Getter-Methode für führt jedoch address public contractOwner
zu einem unerwarteten Ergebnis.
> var deployed;
undefined
> var contract = new web3.eth.Contract(abi)
undefined
> accounts[0]
'0x78924d231848a2d37781e42A2Fe30737F19b6c5E'
> contract.deploy({data: bytecode}).send({
... from: accounts[0],
... gas: 3000000
... }).then((_deployed) => { deployed = _deployed })
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
> deployed.setProvider(provider)
true
> deployed.methods.foo().call().then(console.log)
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
> 0x78924d231848a2d37781e02A2Fe30v37F19b6c5E
> deployed.methods.contractOwner().call().then(console.log)
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
> 0x0000000000000000000000000000000000000000
Wie Sie sehen können, foo()
funktioniert es einwandfrei, gibt aber contractOwner()
eine leere Adresse zurück. Sollte es nicht sein 0x78924d231848a2d37781e42A2Fe30737F19b6c5E
, was from
während der Bereitstellung als Attribut übergeben wird?
Das Problem ist die Diskrepanz zwischen dem Vertragsnamen , Test
und dem Namen dessen, was wahrscheinlich Ihr Konstruktor sein sollte, TestContract
.
Weil TestContract
nie ausgeführt wurde, owner
wurde nie ein Wert zugewiesen, also behält es seinen Nullwert ( address(0)
). Benennen Sie entweder den Vertrag oder die Funktion um, damit sie als Konstruktor funktioniert.
Wiederholung 122442