天天看點

solidity 0.5中address payable和address的差別?

在Solidity 0.5.x中,位址類型被細分為

address

address payable

,那麼,這兩種類型有什麼差別?如何将

address

類型轉換為

address paybale

類型,或者反向轉換?本文将給出這些問題,并指出Solidity進行位址類型細分的目的。

如果你希望快速掌握以太坊區塊鍊的開發,可以看一下這些 智能合約與DApp開發教程

solidity 0.5将位址類型細分為

address

address payable

的目的在于,它有助于強制智能合約開發人員認真考慮一個位址是否應當接收以太币,如果該位址根本不需要接收以太币,那麼就應當使用

address

類型。當位址被聲明為

address

類型後,如果開發者試圖向該位址轉入以太币,就會導緻編譯時類型錯誤。

address

address payable

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

address payable

address

類型的變量都表示以太坊位址,都可以使用底層的

.call()

方法。從字面意思看,

address payable

表示可用于支付的位址,是以在

address payable

類型的變量上,你可以使用

.transfer()

.send()

方法,但是

address

類型的變量則不能使用這些方法。

是以,

address payable

類型的功能要強于

address

類型,容易了解,

address payable

address

類型的轉換要容易一些(降級使用),而從

address

類型向

address payable

類型的轉換,則需要稍微轉個彎。

1、address payable轉換為address

address payable

類型的變量可以顯式或隐式地轉換為address類型:

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

2、address轉換為address payable

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           

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

雖然單個

address payable

變量可以轉換為

address

類型,或者反之,但是不能直接将整個數組進行轉換。例如:

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

4、内置的變量類型

在Solidity的内置變量中,以下幾個變量的類型都是

address payable

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

你可以使用線上的

Solidity IDE

來測試本文中的Soldity代碼,以便更好地了解在Soldity 0.5中的

address payable

address

類型的差別與互相轉換。

原文連結:

Solidity 0.5 address payable和address的差別是什麼? - 彙智網