Solidity

合約內的 msg.sender.balance

  • May 3, 2019

在合約內部使用 msg.sender.balance 時/應該返回什麼?

假設我們有合約 A,呼叫 B,它正在呼叫 C。 msg.sender 被傳播到 B 和 C 的呼叫 使用者只進行單個事務,即不可能重新排序,並且同一塊中沒有其他事務/費用除了本次交易的gas…

那麼每個合約的價值是多少:

  1. 是否是呼叫前的初始餘額,即與前一個塊一樣
  2. 是否是通話後的餘額,即支付所有 3 份合約/通話的全部費用後的餘額
  3. 是目前數量嗎,即初始餘額 - 到目前為止使用的氣體
  4. 這取決於礦工程式碼(geth、parity 或 ganache)

該過程與使用的客戶端無關。

假設使用者 A 向val合約 B發送一個值

  • B執行前:

    • v從 A 餘額中減去並添加到 B 餘額中
    • gasLimit * gasPrice從 A 餘額中減去
  • B 執行

  • B 執行後

    • (gasLimit - gasUsed) * gasPrice退還給 A
    • gasUsed * 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
 }
}

跟著錢走

  1. Alice 發送 100 wei 給A.doSomething(). 從 A 的角度來看,msg.sender == Alice。愛麗絲有 1,000 個,但她現在發送了 100 個msg.sender.balance == 900
  2. A呼叫合約B.doSomethingElse()。從 B 的角度來看,msg.senderA,不是愛麗絲。A從 Alice 那裡收到 100 wei,所以msg.sender.balance == 100.
  3. B呼叫C. 從 C 的角度來看,msg.senderBB沒錢A,所以msg.sender.balance == 0
  4. A 有100,B 和 C 沒有錢,Alice 有 900 wei。
  5. 愛麗絲支付交易費用。Alice 還剩 < 900 wei。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/70361