Variable ist im Konstruktor nicht auf msg.sender gesetzt

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 contractOwnerzu 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 fromwährend der Bereitstellung als Attribut übergeben wird?

Antworten (1)

Das Problem ist die Diskrepanz zwischen dem Vertragsnamen , Testund dem Namen dessen, was wahrscheinlich Ihr Konstruktor sein sollte, TestContract.

Weil TestContractnie ausgeführt wurde, ownerwurde 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.

Habe meine Antwort gelöscht, weil deine richtig ist.