【Address】
address
可以被用來儲存一個以太坊地址指向的帳戶或智能合約。
當我們在宣告 address
時加上 payable
這個修飾詞(modifier)時,則此 address
就會多兩個成員(members),分別為 transfer
和 send
。address payable
代表可用於支付的地址,反之 address
就不可用於支付任何 eth,也不包含以上多的兩個成員。
Address具有以下的特性:
任何在Ethereum的互動都是Address based
長度為20 byte
myAddress.balance
=> 得到以wei為單位的balance
myAddress.transfer(amountInWei)
=> 自智能合約傳送相對應數量(以wei為單位)的ether給指定地址
Address and Msg.Object
---- Outside Ethereum Blockchain ----
Externally Owned Account(EOA)
用於交易資金、初始化交易、佈署智能合約、提領
擁有一個私鑰來管理帳戶
---- Inside Ethereum Blockchain ----
Contract Account
沒有私鑰來管理帳戶,程式碼決定了整個合約帳戶的運作
智能合約的互動與帳戶關係
使用EOA 初始化交易
途徑常為:EOA -> Contract Account -> Contract Account...(EOA as beginner)
途徑不可為:Contract Account -> Contract Account...(Contract Account as beginner)
只要原點是EOA,接下來無論是Contract Account或EOA皆可與彼此交互運作
成員函式與合約之間互動的方法
.balance
:可以得到當前地址的餘額,以 wei 為單位。
<address>.balance()
.transfer
:有
gas
限制,最大2300<address payable>.transfer(uint256 amount)
此函式會從合約轉入帳號 amount 價值,wei 單位的 eth
如果執行失敗會拋出錯誤
.send
:有
gas
限制,最大2300<address payable>.send(uint256 amount) returns (bool)
此函式會從合約轉入帳號 amount 價值,wei 單位的 eth
是一個屬於
.transfer
的低階部件,如果執行.send
失敗的話不會把整個合約停止,而是會 returnfalse
。不會改變任何的「狀態」。
.call
:沒有
gas
限制<address>.call(bytes memory) returns (bool, bytes memory)
和
send
一樣,如果執行失敗不會停止而是 return false<address>.call.value(amount)()
功能類似<address>.transfer
會從合約轉入帳號 amount 價值的 eth<address>.call.gas()
可以調整供給的gas
數量,並且returnns 一個 boolean值
.delegatecall
:暫略.staticcall
:暫略
雖然 .delegatecall
, .staticcall
我們暫時略過,但.call
, .delegatecall
, .staticcall
以上三者都可以調用 gas
參數,而 value
參數只有 .call
可以使用。此三者都是非常底層的函數,所以我們應該要盡量避免直接 hard-code gas
在我們的智能合約,除非我們十分確定要這麼做。
使用範例:
如果使用
<address>.transfer(uint amount)
、<address>.send(uint amount)
, 這個<address>
代稱的合約地址中必須增加callback
回調函數!
address vs. address payable
在這裡更深入地探討 <address>
和 <address payable>
。兩者的區別僅在編譯時存在,在編譯後的合約代碼中就沒有區別了。
而在編譯時兩者最大的區別就在型別轉換:
Last updated
Was this helpful?