Solidity 0.5 address payable和address的區別是什麼?

在Solidity 0.5.x中,地址類型被細分爲addressaddress payable,那麼,這兩種類型有什麼區別?如何將address類型轉換爲address paybale類型,或者反向轉換?本文將給出這些問題,並指出Solidity進行地址類型細分的目的。數組

區塊鏈開發課程精選

solidity 0.5將地址類型細分爲addressaddress payable的目的在於,它有助於強制智能合約開發人員認真考慮一個地址是否應當接收以太幣,若是該地址根本不須要接收以太幣,那麼就應當使用address類型。當地址被聲明爲address類型後,若是開發者試圖向該地址轉入以太幣,就會致使編譯時類型錯誤。區塊鏈

addressaddress payable類型都用來存儲160位的以太坊地址,二者的區別僅在編譯時存在,在編譯後的合約代碼中就沒有區別了——也就是說,引入地址類型細分的惟一 目的就是幫助開發者在編譯期理清一個地址的實際用途。測試

address payableaddress類型的變量都表示以太坊地址,均可以使用底層的.call()方法。從字面意思看,address payable表示可用於支付的地址,所以在address payable類型的變量上,你能夠使用.transfer().send()方法,可是address類型的變量則不能使用這些方法。ui

所以,address payable類型的功能要強於address類型,容易理解,address payableaddress類型的轉換要容易一些(降級使用),而從address類型向address payable類型的轉換,則須要稍微轉個彎。3d

一、address payable轉換爲address

address payable類型的變量能夠顯式或隱式地轉換爲address類型:code

address payable addr1 = msg.sender;
address addr2 = addr1; // 正確
address addr3 = address(addr1); // 正確

二、address轉換爲address payable

address類型的變量只能顯式地轉換爲address payable,須要首先轉換爲整數類型(例如uint160),而後再將該整型值轉換爲address類型,就能夠獲得address payableblog

address addr1 = msg.sender;
address payable addr2 = addr1; // 錯誤,address不能隱式地轉換爲address payable
address payable addr3 = address(uint160(addr1)); // 正確,先轉換爲uint160,而後轉換爲address payable

三、address[]或address payable[]的轉換

雖然單個address payable變量能夠轉換爲address類型,或者反之,可是不能直接將整個數組 進行轉換。例如:開發

function testCast(address payable[] memory _addresses) returns (address[] memory)
{
    return _addresses; // 錯誤!
}

四、內置的變量類型

在Solidity的內置變量中,如下幾個變量的類型都是address payablerem

  • msg.sender
  • tx.origin
  • block.coinbase

你能夠使用在線的Solidity IDE來測試本文中的Soldity代碼,以便更好地理解在Soldity 0.5中的address payableaddress類型的區別與相互轉換。get


匯智網原創,轉載請標明出處。

相關文章
相關標籤/搜索