ContractFactory всегда отправляет один и тот же адрес после развертывания контракта

Я разрабатываю приложение для аренды, используя трюфель с угловым 5, для которого мне нужно начинать новый контракт каждый раз, когда новый арендатор арендует дом у владельца. Для этой цели я развернул ContractFactory, используя truffle. Ниже приведен мой контрактФабрика

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;
  }
}

каждый раз, когда мне нужен новый контракт между владельцем и арендатором, я вызываю функцию newContract этого ContractFactory, но проблема в том, что этот ContractFactory всегда возвращает один и тот же адрес для каждого контракта. Вот мой угловой сервис, который использует web3 для вызова этой функции contractFacotry.

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);
          });
      });
  }
}

я пробовал вызывать getContractCount()функцию из контрактной фабрики, но она также все время возвращает ноль. Любая идея, что здесь не так?

Ответы (1)

Вам нужно удалить слово constantиз этой строки.

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

constantжестко закрепляет идею о том, что это функция только для чтения (пробный запуск, что если), которая не может обновлять состояние.

Надеюсь, поможет.

удалив константу, я получаю сообщение об ошибке «Ошибка: неверный адрес»
Вы, вероятно, получаете хэш транзакции из подписанной транзакции, а не адрес из возврата. Исправленный контракт может потребовать некоторых изменений на стороне клиента, таких как способ обнаружения нового адреса контракта после фактического майнинга транзакции.
d0 мне нужно сделать функцию прочности платной? это одно решение, которое я получил, погуглив его. Когда я попробовал это, он вернул детали транзакции, но адрес снова был таким же, когда вызывался более одного раза.
не могли бы вы взглянуть на это? эфириум.stackexchange.com/questions/45502/…
Зак опередил меня. Я рад, что теперь у тебя все в порядке. Спасибо за согласие ;-)