Solidity知識點集 — payable 修飾符與提現(xiàn)(七)

payable 修飾符

payable 方法是讓 Solidity 和以太坊變得如此酷的一部分 —— 它們是一種可以接收以太的特殊函數(shù)。

在以太坊中, 因為錢 (以太), 數(shù)據(jù) (事務(wù)負(fù)載), 以及合約代碼本身都存在于以太坊。你可以在同時調(diào)用函數(shù) 并付錢給另外一個合約。

contract OnlineStore {
  function buySomething() external payable {
    // 檢查以確定0.001以太發(fā)送出去來運行函數(shù):
    require(msg.value == 0.001 ether);
    // 如果為真,一些用來向函數(shù)調(diào)用者發(fā)送數(shù)字內(nèi)容的邏輯
    transferThing(msg.sender);
  }
}

在這里,msg.value 是一種可以查看向合約發(fā)送了多少以太的方法,另外 ether 是一個內(nèi)建單元。

這里發(fā)生的事是,一些人會從 web3.js 調(diào)用這個函數(shù) (從DApp的前端), 像這樣 :

// 假設(shè) `OnlineStore` 在以太坊上指向你的合約:
OnlineStore.buySomething().send(from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001))

注意這個 value 字段, JavaScript 調(diào)用來指定發(fā)送多少(0.001)以太。如果把事務(wù)想象成一個信封,你發(fā)送到函數(shù)的參數(shù)就是信的內(nèi)容。 添加一個 value 很像在信封里面放錢 —— 信件內(nèi)容和錢同時發(fā)送給了接收者。

提現(xiàn)

在你發(fā)送以太之后,它將被存儲進(jìn)以合約的以太坊賬戶中, 并凍結(jié)在哪里 —— 除非你添加一個函數(shù)來從合約中把以太提現(xiàn)。

你可以寫一個函數(shù)來從合約中提現(xiàn)以太,類似這樣:

contract GetPaid is Ownable {
  function withdraw() external onlyOwner {
    owner.transfer(this.balance);
  }
}

你可以通過 transfer 函數(shù)向一個地址發(fā)送以太, 然后 this.balance 將返回當(dāng)前合約存儲了多少以太。 所以如果100個用戶每人向我們支付1以太, this.balance 將是100以太。

你可以通過 transfer 向任何以太坊地址付錢。 比如,你可以有一個函數(shù)在 msg.sender 超額付款的時候給他們退錢:

uint itemFee = 0.001 ether;
msg.sender.transfer(msg.value - itemFee);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文翻譯自:https://github.com/ConsenSys/smart-contract-best-pr...
    tolak閱讀 5,252評論 4 21
  • 看天上的云 細(xì)數(shù)我們在一起的光陰 那一抹紅霞 是否能感受到我在想他 我還是控制不住自己呀 思念滴滴答答 流過我的心...
    何夢潔閱讀 245評論 0 4
  • 今天開始,2018年的第一天工作。 早上5點半醒來,很自然地揉腹,就這樣讓自己的身體醒過來。 我給自己定的計劃是每...
    綻蕊向陽閱讀 206評論 0 0
  • 他人笑我太瘋癲 學(xué)著唐寅作詩篇 我笑他人看不穿 其實我曾未得閑 慣看風(fēng)花和雪月 如花美眷似榴蓮 不見案前花一片 只...
    得一生二閱讀 769評論 0 0

友情鏈接更多精彩內(nèi)容