由于Solidity是基于以太坊(Ethereum)的,故而其语言层面可以直接支持货币支付1。

payable标识的函数

函数上增加payable标识,即可接收ether,并会把ether存在当前合约,如下述示例中的deposit函数。

pragma solidity ^0.4.0;contract supportPay{//存入一些ether用于后面的测试function deposit() payable{}//查询当前的余额function getBalance() constant returns(uint){return this.balance;}
}

在上面的代码中,你可以通过deposit()向当前合约存入ether,注意这是通过函数调用,在调用中通过address.call(某个方法).value(要发送的ether)来实现的,这里可以参考: http://me.tryblockchain.org/Solidity-call-callcode-delegatecall.html 。

send()函数发送ether

地址对象中的send()可以向某地址直接进行支付,下面是一个向合约帐户支付的示例:

当我们使用address.send(ether to send)向某个地址转帐,如果是普通地址将会直接收到,就非常简单了。我们这里将用合约来模拟发送与接收:

pragma solidity ^0.4.0;contract SendAndReceiveByContract{//fallback函数对应记录事件event fallbackTrigged(bytes data);//合约接收send()的 ether时,必须存在function() payable{fallbackTrigged(msg.data);}//存入一些ether用于后面的测试function deposit() payable{}//查询当前的余额function getBalance() constant returns(uint){return this.balance;}event SendEvent(address to, uint value, bool result);//使用send()发送etherfunction sendEther(){//使用this来模拟从另一个合约发送bool result = this.send(1);SendEvent(this, 1, result);}
}

在上述的代码中,我们先要使用deposit()合约存入一些ether,否则由于余额不足,调用send()函数将报错。存入ether后,我们调用sendEther(),使用send()向合约发送数据,将会触发下述事件:

SendEvent["0xc35f7ac1351648b0b8a699c5f07dd6a78f626714","1","true"
]
fallbackTrigged["0x"
]

可以看到,我们成功使用send()发送了1wei到合约。

这里需要特别注意的是,下面大家先记着,后面 http://me.tryblockchain.org/blockchain-solidity-fallback.html 会说明,合约要接收通过send()函数发送的ether,有下面的限制:

  1. 如果我们要在合约中通过send()函数接收,就必须定义fallback函数,否则会抛异常。
  2. fallback函数必须增加payable关键字,否则send()执行结果将会始终为false

支付中可能的失败

send()失败

由于调用者可以强制指定调用堆栈的深度,当调用的栈深超过指定值时,一般是1024;或者接收地址处理支付过程中out of gas。由于失败,此时的send()的结果是false

合约的fallback()

如果是合约地址,在执行send()时,会默认关联执行fallback()(如果存在这个函数)。这是EVM的默认行为,不可被阻止。所以这个函数引起out of gas或其它失败,整个交易被撤销。由于失败,此时的send()的结果是false

payable标识2

细心的读者可能发现在deposit函数上有一个payable关键字,如果一个函数需要进行货币操作,必须要带上payable关键字,这样才能正常接收msg.value

关于作者
专注基于以太坊(Ethereum)的相关区块链(Blockchain)技术,了解以太坊,Solidity,Truffle等。个人博客:http://me.tryblockchain.org


  1. 原文参考:http://solidity.readthedocs.io/en/develop/types.html#address ↩

  2. 更多关于payable标识的信息请查看:http://solidity.readthedocs.io/en/develop/control-structures.html?highlight=payable#expressions-and-control-structures ↩

solidity之以太币支付相关推荐

  1. 以太币转帐速度_燃起来吧!一文带你读懂以太坊网络中的Gas、Gas Fee、Gas Price、Gas...

    曾用过区块链相关应用,不管是交易所.DApp 或是虚拟货币钱包的人,一定都听过矿工费(Gas Fee) 这个词.它是当你要在区块链网路发起一笔交易时,所要支付给矿工的一笔手续费.其实很容易理解,就好比 ...

  2. 以太币(Ether)的单位

    原文地址:https://zhuanlan.zhihu.com/p/28994731 以太币(Ether)的单位 李明阳 手持两把锟斤拷,口中疾呼烫烫烫 已关注 71 人赞了该文章 在以太坊(Ethe ...

  3. android web3j 代币查询_使用Web3.js查询以太币和代币余额以及转账

    前言 前面的文章也提到了,使用web3.js可以与以太坊进行互动.这篇文章的主要内容如下:解决web3.js版本问题 2.使用web3.js查询以太币及代币余额,以及进行以太币和代币转账 1.web3 ...

  4. 因合约代码Bug,约2.2亿元11539枚以太币被永久锁定

    上周五,一个叫AkuDreams的3D动画NFT项目在荷兰拍卖会上遭遇了Bug惨案,因智能合约代码bug,投标者的 11539.5 枚以太币被永久锁定,且无法退款.该加密货币价值 3400 万美元,约 ...

  5. solidity开发以太坊代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  6. 【区块链 | Solidity】以太坊Solidity如何实现海量空投代币?

    以太坊Solidity如何实现海量空投代币? 1. 摘要 通证token项目启动时,短期内繁荣生态,要舍得给粉丝们打币,把利益分出去.本文聚焦在技术层面,实现如何快速完成TOKEN海量空投,既要节约时 ...

  7. solidity payable_以太坊区块链搭建与使用(五)-智能合约Solidity

    一.智能合约Solidity开发工具 1.remix-ide http://remix.ethereum.org/ 在线版本,也可以去github下载安装到本地.开发.编译.发布.执行.测试 2.re ...

  8. 正确地实现以太币转账

    原文地址:https://medium.com/@kidinamoto/how-to-send-ether-correctly-a60208ad76d9 Compare send, call & ...

  9. 以太坊私链搭建、truffle项目开发

    本文实现以下目标: 搭建一条以太坊私链 用企业级开发方式开发.部署一个项目 分析truffle执行过程 solidity.web3等的一些说明 Token ERC20标准 contract ERC20 ...

最新文章

  1. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  2. CUDA tool URL
  3. REST技术第四步 多个參数注解问题
  4. mysql树状查询优化_解析SQL中树形分层数据的查询优化
  5. STM32L之可编程电压检测(PVD)
  6. php设置session 生命周期,php会话(session)生命周期概念介绍及设置更改和回收
  7. bilibili源码_bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋
  8. LAMP/LNMP环境下:phpinfo php连接mysql php执行mysql查询 测试代码及响应
  9. 别再被三次握手和四次挥手所支配!把TCP这玩意儿给你掰开了说
  10. 参数传值,for循环,数组,对象。
  11. python 空对象,在Python中创建一个空对象
  12. 药物临床试验数据递交FDA的规定
  13. 搭建 Extmail企业邮件服务
  14. Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)
  15. 第十五篇,man手册
  16. 使用FFmpeg进行mp4与m3u8之间转换
  17. 超越源域的攻击:面向黑盒域制作对抗样本
  18. 如何在PDF中插入另一个PDF文件的页面
  19. ens天空盒_这句话是什么意思啊
  20. 概率分布 ---- 均匀分布

热门文章

  1. android rom 属性 分辨率,ROM的 build.prop参数详解
  2. post .php程序,php程序内部post数据的方法
  3. 加州大学欧文计算机工程硕士,UCI加州大学尔湾分校软件工程硕士Master of Software Engineering...
  4. LeetCode: Add Binary 解题报告
  5. 2018-2019-2 20175308实验一 《Java开发环境的熟悉》实验报告
  6. C常用的字符串函数实现
  7. linux下的mongodb数据库原生操作
  8. 一个好的桌面图标的网站
  9. NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现-
  10. promise实现红绿灯