Я разрабатываю приложение для аренды, используя трюфель с угловым 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()
функцию из контрактной фабрики, но она также все время возвращает ноль. Любая идея, что здесь не так?
Вам нужно удалить слово constant
из этой строки.
function newContract(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant) public constant returns(address) {
constant
жестко закрепляет идею о том, что это функция только для чтения (пробный запуск, что если), которая не может обновлять состояние.
Надеюсь, поможет.
Шоаиб Икбал
Роб Хитченс
Шоаиб Икбал
Шоаиб Икбал
Роб Хитченс