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?
Sie müssen das Wort constant
aus dieser Zeile entfernen.
function newContract(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant) public constant returns(address) {
constant
ist 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.
Schoaib Iqbal
Rob Hitchens
Schoaib Iqbal
Schoaib Iqbal
Rob Hitchens