Solidity

通過合約地址與solidity合約互動

  • April 10, 2018

我有契約工廠,如下所示

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


contract contractFactory {
 address[] public contracts;


 function getContractCount() public constant returns(uint contractCount) {
   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 的函式,它創建另一個名為 RentalContract 的合約的對象,並返回新創建對象的地址。現在我想使用 web3js 通過這個地址與這個新創建的租賃契約實例進行互動。我怎樣才能做到這一點?

編輯

這是我的租賃契約

pragma solidity ^0.4.8;

contract Rental {
   struct PaidRent {
       uint id;
       uint value;
   }
   PaidRent[] public paidrents;

   uint public createdTimestamp;
   uint public rent;
   uint public security_deposit;
   string public house;
   address public owner;
   address public tenant;

   enum State {Created, Started, Terminated}
   State public state;
   function Rental(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant) {
       createdTimestamp = block.timestamp;
       rent = _rent;
       security_deposit = _security_deposit;
       house = _house;
       owner = _owner;
       tenant = _tenant;
   }
   modifier require(bool _condition) {
       if(!_condition) throw;
       _;
   }
   modifier ownerOnly() {
       if(msg.sender != owner) throw;
       _;
   }
   modifier TenantOnly() {
       if(msg.sender != tenant) throw;
       _;
   }
   modifier inState(State _state){
       if(_state != state) throw;
       _;
   }

   function getPaidRents() internal returns (PaidRent[]) {
       return paidrents;
   }

   function getHouse() constant returns (string) {
       return house;
   }
   function getowner() constant returns (address) {
       return owner;
   }
   function getTenant() constant returns (address) {
       return tenant;
   }
   function getRent() constant returns (uint) {
       return rent;
   }
   function getDeposit() constant returns (uint) {
       return security_deposit;
   }
   function getContractCreated() constant returns (uint) {
       return createdTimestamp;
   }
   function getContractAddress() constant returns (address) {
       return this;
   }
   function getState() returns (State) {
       return state;
   }
   function CollectEth() payable  {}

   function payRent() TenantOnly inState(State.Started) require(msg.value == rent) {
       owner.transfer(msg.value);
       paidrents.push(PaidRent({
           id : paidrents.length + 1,
           value : msg.value
       }));
   }


   function terminateContract(address deposit_to) inState(State.Started) require(this.balance == security_deposit) {
       deposit_to.transfer(security_deposit);
       state = State.Terminated;
   }



}

我可以通過 contractFactory 的名為 newContract 的函式創建此租賃契約的新實例。var c2 = Rental.at('0x0109b453ea7734c2c32c3fc73b80de42d6e81f8e')我可以通過truffle 控制台與這個新的租賃契約進行互動。但我不知道如何在我的 Angular 服務中使用 web3js 做到這一點。如果我嘗試以與松露控制台相同的方式使用它,它會說找不到名稱出租。

新創建契約的 ABI 與 RentalContrat 的 ABI 相同。您需要的另一件事是地址。您可能需要實現一個函式來讀取地址數組。一旦你有了它,你就可以按照任何可用的 web3 教程進行操作,或者只是按照 readthedocs 中的 web3 範例進行操作。

我希望這有幫助

編輯:https ://dappsforbeginners.wordpress.com/tutorials/interactions-between-contracts/

編輯後的編輯:

您擁有租賃契約,因此您擁有 ABI。假設您已經註入了 web3,您現在可以執行以下操作:

var Rental = web3.eth.contract(ABI);
var rentalInstance = Rental.at('0x0109b453ea7734c2c32c3fc73b80de42d6e81f8e')

我假設它沒有找到 Rental 的原因是沒有定義 ABI。

我希望這可以幫助你。

引用自:https://ethereum.stackexchange.com/questions/45194