在Solidity 0.5.x中,地址類型被細分爲address
和address payable
,那麼,這兩種類型有什麼區別?如何將address
類型轉換爲address paybale
類型,或者反向轉換?本文將給出這些問題,並指出Solidity進行地址類型細分的目的。數組
solidity 0.5將地址類型細分爲address
和address payable
的目的在於,它有助於強制智能合約開發人員認真考慮一個地址是否應當接收以太幣,若是該地址根本不須要接收以太幣,那麼就應當使用address
類型。當地址被聲明爲address
類型後,若是開發者試圖向該地址轉入以太幣,就會致使編譯時類型錯誤。區塊鏈
address
和address payable
類型都用來存儲160位的以太坊地址,二者的區別僅在編譯時存在,在編譯後的合約代碼中就沒有區別了 —— 也就是說,引入地址類型細分的惟一目的就是幫助開發者在編譯期理清一個地址的實際用途。測試
address payable
和address
類型的變量都表示以太坊地址,均可以使用底層的.call()
方法。從字面意思看,address payable
表示可用於支付的地址,所以在address payable
類型的變量上,你可使用.transfer()
和.send()
方法,可是address
類型的變量則不能使用這些方法。ui
所以,address payable
類型的功能要強於address
類型,容易理解,address payable
向address
類型的轉換要容易一些(降級使用),而從address
類型向address payable
類型的轉換,則須要稍微轉個彎。code
address payable
類型的變量能夠顯式或隱式地轉換爲address類型:blog
address payable addr1 = msg.sender; address addr2 = addr1; // 正確 address addr3 = address(addr1); // 正確
address
類型的變量只能顯式地轉換爲address payable
,須要首先轉換爲整數類型(例如uint160),而後再將該整型值轉換爲address類型,就能夠獲得address payable
:開發
address addr1 = msg.sender; address payable addr2 = addr1; // 錯誤,address不能隱式地轉換爲address payable address payable addr3 = address(uint160(addr1)); // 正確,先轉換爲uint160,而後轉換爲address payable
雖然單個address payable
變量能夠轉換爲address
類型,或者反之,可是不能直接將整個數組進行轉換。例如:rem
function testCast(address payable[] memory _addresses) returns (address[] memory) { return _addresses; // 錯誤! }
在Solidity的內置變量中,如下幾個變量的類型都是address payable
:get
你可使用在線的Solidity IDE來測試本文中的Soldity代碼,以便更好地理解在Soldity 0.5中的address payable
和address
類型的區別與相互轉換。it