Solidity
合約內的 msg.sender.balance
在合約內部使用 msg.sender.balance 時/應該返回什麼?
假設我們有合約 A,呼叫 B,它正在呼叫 C。 msg.sender 被傳播到 B 和 C 的呼叫 使用者只進行單個事務,即不可能重新排序,並且同一塊中沒有其他事務/費用除了本次交易的gas…
那麼每個合約的價值是多少:
- 是否是呼叫前的初始餘額,即與前一個塊一樣
- 是否是通話後的餘額,即支付所有 3 份合約/通話的全部費用後的餘額
- 是目前數量嗎,即初始餘額 - 到目前為止使用的氣體
- 這取決於礦工程式碼(geth、parity 或 ganache)
該過程與使用的客戶端無關。
假設使用者 A 向
val
合約 B發送一個值
B執行前:
v
從 A 餘額中減去並添加到 B 餘額中gasLimit * gasPrice
從 A 餘額中減去B 執行
B 執行後
(gasLimit - gasUsed) * gasPrice
退還給 AgasUsed * gasPrice
被添加到礦工
這裡有很多誤解的空間,所以我將把它分成不同的關注點。
讓我們假設 Alice 向 ContractA 發送一筆交易,後者呼叫 ContractB,後者呼叫 ContractC。我們還假設交易從 Alice 的錢包中取出 100 wei,並將其交給 ContractA。最後,讓我們假設 Alice 以 1,000 wei 開始。最後,讓我們假設在我們開始之前沒有任何合約有錢。
在我們開始之前,大致了解一下合約函式鏈可能會有所幫助。
contract A { ... function doSomething() public payable { // msg.sender.balance: 900 // address(this).balance: 100; contractB.doSomethingElse(); } } contract B { ... function doSomethingElse() public { // address(this).balance: 0 // msg.sender.balance: 100 contractC.doLastThing(); } } contract C { ... function doLastThing() public { // msg.sender.balance: 0 // address(this).balance: 0 } }
跟著錢走
- Alice 發送 100 wei 給
A.doSomething()
. 從 A 的角度來看,msg.sender == Alice
。愛麗絲有 1,000 個,但她現在發送了 100 個msg.sender.balance == 900
。A
呼叫合約B.doSomethingElse()
。從 B 的角度來看,msg.sender
是A
,不是愛麗絲。A
從 Alice 那裡收到 100 wei,所以msg.sender.balance == 100
.B
呼叫C
. 從 C 的角度來看,msg.sender
是B
。B
沒錢A
,所以msg.sender.balance == 0
。- A 有
100
,B 和 C 沒有錢,Alice 有 900 wei。- 愛麗絲支付交易費用。Alice 還剩 < 900 wei。
希望能幫助到你。