Solidity
通過合約地址與solidity合約互動
我有契約工廠,如下所示
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。
我希望這可以幫助你。