ContractFactory sendet nach der Bereitstellung des Vertrags immer dieselbe Adresse

Ich entwickle eine Mietanwendung mit Trüffel mit Winkel 5, für die ich jedes Mal einen neuen Vertrag abschließen muss, wenn ein neuer Mieter ein Haus vom Eigentümer mietet. Zu diesem Zweck habe ich eine ContractFactory mit Truffle bereitgestellt. Es folgt meine ContractFactory

pragma solidity ^0.4.8;
import './RentalContract.sol';


contract contractFactory {
  address[] public contracts;


  function getContractCount() public constant returns(uint) {
    return contracts.length;
  }

  function newContract(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant)
  public constant returns(address) {
    Rental c = new Rental(_rent, _security_deposit, _house, _owner, _tenant);
    contracts.push(c);
    return c;
  }
}

Jedes Mal, wenn ich einen neuen Vertrag zwischen Eigentümer und Mieter benötige, rufe ich die newContract-Funktion dieser ContractFacotry auf, aber das Problem ist, dass diese ContractFactory immer dieselbe Adresse für jeden Vertrag zurückgibt. Hier ist mein Winkeldienst, der web3 verwendet, um diese ContractFacotry-Funktion aufzurufen.

import { Injectable } from '@angular/core';
import * as Web3 from 'web3';
import {Observable} from 'rxjs/Observable';
import { fromPromise } from 'rxjs/observable/fromPromise';
import {observable} from "rxjs/symbol/observable";
import {reject} from "q";

const FactoryArtifacts = require('/home/work/angularplustruffle/angular4-truffle-starter-dapp/build/contracts/contractFactory.json');
const contract = require('truffle-contract');
const RentalArtifacts = require('/home/work/angularplustruffle/angular4-truffle-starter-dapp/build/contracts/Rental.json');

declare let require: any;
declare let window: any;

@Injectable()
export class ContractsService {
  ContractFactory = contract(FactoryArtifacts);
  Rental = contract(RentalArtifacts);
  private web3: any;
  public acc_no: any = 5;

  constructor() {
    if (typeof window.web3 !== 'undefined') {
      // Use Mist/MetaMask's provider
      this.web3 = new Web3(window.web3.currentProvider);
      this.ContractFactory.setProvider(window.web3.currentProvider);
      this.Rental.setProvider(window.web3.currentProvider);

      /* if (this.web3.version.network !== '4') {
        alert('Please connect to the Rinkeby network');
      } */
    } else {
      console.warn(
        'Please use a dapp browser like mist or MetaMask plugin for chrome'
      );
    }
  }
  public deployRentalContract(rent, security_deposit, house, owner, tenant): Observable<any> {
    let meta;
      return Observable.create( observer => {
        this.ContractFactory
          .deployed()
          .then( instance => {
              meta = instance;
              return meta.newContract(rent, security_deposit, house, owner, tenant);
          })
          .then(value => {
            console.log("value is");
            console.log(value);
            observer.next(value);
            observer.complete();
          })
          .catch(e => {
            console.log(e);
            observer.error(e);
          });
      });
  }
}

Ich habe versucht, getContractCount()die Funktion von Contract Factory aufzurufen, aber es gibt auch die ganze Zeit Null zurück. eine Ahnung was hier falsch ist?

Antworten (1)

Sie müssen das Wort constantaus dieser Zeile entfernen.

function newContract(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant) public constant returns(address) {

constantist die Idee fest verdrahtet, dass es sich um eine schreibgeschützte Funktion (Trockenlauf, was wäre wenn) handelt, die den Status nicht aktualisieren kann.

Ich hoffe es hilft.

Durch Entfernen der Konstante erhalte ich den Fehler "Fehler: ungültige Adresse".
Sie erhalten wahrscheinlich einen Transaktions-Hash von der signierten Transaktion anstelle einer Adresse von der Rückgabe. Der korrigierte Vertrag kann einige Änderungen auf der Kundenseite erfordern, z. B. die Art und Weise, wie Sie die neue Vertragsadresse entdecken, nachdem die Transaktion tatsächlich abgebaut wurde.
d0 Ich muss die Solidity-Funktion zahlbar machen? Dies ist eine Lösung, die ich durch Googeln erhalten habe. Als ich es versuchte, gab es die Transaktionsdetails zurück, aber die Empfängeradresse war wieder dieselbe, wenn sie mehr als einmal aufgerufen wurde.
kannst du dir das bitte anschauen? ethereum.stackexchange.com/questions/45502/…
Zack ist mir zuvorgekommen. Ich bin froh, dass du jetzt alles geklärt hast. Danke für's Annehmen ;-)