在以太坊智能合约开发中,有时需要向智能合约地址直接转账,比如ico众筹, 目前有三种方式:
创建合约时转账
调用合约方法时转账
直接向合约地址进行转账
创建合约时转账
在进行合约开发时,如果想要在创建合约时直接向该合约进行转账,只需要给构造函数中添加payable修饰符
contract C {
function C() payable{
}
}
执行合约方法转账
需要给你需要支持转账功能的方法添加payable修饰符
function d() payable {
a = 3;
}
直接转账支持直接转账,需要借助默认函数(fallback function),默认函数是没有名字的函数,如下
function () payable {
a = 3;
}用户如何向智能合约转账
用户向智能合约转账的核心是填充transaction.value的值,该值就是转账的金额,evm会执行先扣款后验证的逻辑,即不管对应的函数是否支持转账都会先扣除value实现转账,如果对应的函数不支持转账,对应的函数的代码会通过revert指令撤销前面的转账操作。具体原理看下面的Payable关键词原理
Payable关键词原理
payable关键词是编译器支持的,函数是否带有payable关键词,编译器会生成不一样的代码。如果不带有payable关键词,会在函数的入口添加callvalue的检验。
构造函数不带payable标识
普通函数的payable
普通函数是一样的,如果没有加payable, 每个函数入口都会检测CALLVALUE
留言与评论(共有 0 条评论) |