Solidity
Solidity將應付函式的值發送給所有者:“發送和轉移僅適用於’地址支付’類型的對象,而不是地址”
簡單的測試/案例,有一個應直接向所有者匯款的支付功能。我得到了標題中的錯誤。程式碼:
address private owner; constructor() { owner = msg.sender; } function makePay() public payable { owner.transfer(msg.value); }
現在,如果我嘗試聲明
address private payable owner;
我得到錯誤Expected identifier but got payable
。另外,如果我在建構子中嘗試
address payable private owner;
,則會收到錯誤消息type address is not implicitly convertible to expected type address payable
。我怎樣才能解決這個問題?我在這裡缺少的基本原則是什麼?對此和學習的新手,謝謝。
最新版本 (>0.8.0) 的正確語法是:
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; contract YourContract { address payable private owner; constructor() { owner = payable(msg.sender); } function makePay() public payable { owner.transfer(msg.value); } }
另外,如果我嘗試支付應付私人所有者的地址;然後在我的建構子中,我得到錯誤類型地址不能隱式轉換為預期的應付類型地址。
這是因為 msg.sender 是地址類型,而不是預設的地址支付。您必鬚根據設計明確將地址標記為應付。如範例中所示,您將 msg.sender 變數轉換為使用 payable(your_address) 支付的地址類型。
您還可以將演員表推遲到您真正需要它的那一刻:
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; contract YourContract { address private owner; constructor() { owner = msg.sender; } function makePay() public payable { payable(owner).transfer(msg.value); } }
基本原則很簡單,因為你要轉移有價值的代幣,所以語言的定義方式是你必須明確允許它這樣做。