Remix

與 web3.py 中已部署的智能合約互動

  • April 25, 2021

我的問題與這篇文章中提供的問題有關。但是,我正在尋找的答案在該文章中不可用。

假設賣方(所有者)部署以下合約。

contract Purchase {
   uint public value;
   address public seller;
   address public buyer;
   enum State { Created, Locked, Inactive }
   State public state;

constructor() public payable {
   seller = msg.sender;
   value = msg.value / 2;
   require((2 * value) == msg.value, "Value has to be even.");
}

modifier condition(bool _condition) {
   require(_condition);
   _;
}

modifier onlyBuyer() {
   require(
       msg.sender == buyer,
       "Only buyer can call this."
   );
   _;
}

modifier onlySeller() {
   require(
       msg.sender == seller,
       "Only seller can call this."
   );
   _;
}

modifier inState(State _state) {
   require(
       state == _state,
       "Invalid state."
   );
   _;
}

event Aborted();
event PurchaseConfirmed();
event ItemReceived();

function abort()
   public
   onlySeller
   inState(State.Created)
{
   emit Aborted();
   state = State.Inactive;
   seller.transfer(address(this).balance);
}

function confirmPurchase()
   public
   inState(State.Created)
   condition(msg.value == (2 * value))
   payable
{
   emit PurchaseConfirmed();
   buyer = msg.sender;
   state = State.Locked;
}

function confirmReceived()
   public
   onlyBuyer
   inState(State.Locked)
{
   emit ItemReceived();

   state = State.Inactive;

   buyer.transfer(value);
   seller.transfer(address(this).balance);
}

}

一旦賣方部署了契約,買方(地址)如何與 web3.py 中已部署的契約(確保新的 msg.sender 是買方)進行互動。這可以使用“地址”選項在 Remix 中完成。

注意:我使用 Ganache 作為本地測試網路。

在混音中的地址選項

您可以使用 web3.py 與任何現有合約進行互動。

  1. web3.eth.contract您通過將契約 ABI 傳遞給它來創建一個新的契約類
  2. 您可以通過在建構子中提供已部署合約的地址來創建此新合約類的新實例

一些範常式式碼:

# Load abi from JSON file 
abi = "..."
Purchase = w3.eth.contract(abi=abi)
my_contract = Purchase(contract_address)
my_contract.confirmPurchase().transact({'from': "0x ...my_configured_web3_accoint", value, to_wei("1", "ether")})

您還需要學習如何使用 web3.py 帳戶。

更多資訊在web3.py 文件中。

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