Solidity中,一个函数可以有多个参数,也可有多个返回值。
一、函数定义
contract SimpleContract{
function calculate(uint a,uint b) returns(uint sum,uint product){
sum=a+b;
product=a*b;
//或者使用return(a+b,a*b);
}
}
二、函数调用
1、内部调用(调用同一合约中的函数)
在合约内部,使用foo(a,b),即可发起一个内部调用,foo是函数名,a\b是参数,内部调用对应EVM指令集中的JUMP指令,非常高效,在此期间,内存不会被回收。
2、外部调用
外部调用会创建一个消息发送给被调用的合约。this.a()或者foo.bar(),即可调用外部的合约函数,这里的foo是合约的实例,bar()才是函数。外部调用会将函数调用的所有参数都保存到内存中。注意:构造函数中不能通过this来调用函数,因为还没new完。
3、抛出异常
- 调用合约不存在
- 被调用的不是一个合约账户,即该账户不包括代码
- 被调用的函数抛出了异常
- 调用过程中Gas耗尽
4、可见性修饰词
- external:用于修饰函数,表示函数为一个外部函数,外部函数是合约接口的一部分,这意味着只能通过其他合约发送交易的方式来调用这个函数
- public:用来修饰公开的函数、变量,表明函数、变量既可以在合约外部访问,也可以在合约内部访问
- internal:内部函数、变量,表示只能在当前合约或者继承自当前合约的其他合约中访问。
- private:私有函数和变量,只有当前合约内部才能访问
5、view关键字
constant和view关键字告诉编译器这个函数进行的只是只读操作,不会造成其他状态变化
例:
contract SimpleContract{ function f(uint a,uint b) view returns(uint){ return a*(b+42)+now; } }
6、fallback函数
当一个合约收到无法匹配任何函数名的函数调用或仅仅用于转账的交易时,fallback函数将会被自动执行,默认行为是抛出异常。但我们可以用function () {.....}来重载函数。
如果我们想让合约以简单的Transfer方式进行以太币转账,则需要如 function() payable{} 来实现fallback函数,即加上payable关键字。
当手动实现fallback函数时,要注意Gas的消耗,因为fallback函数只有非常少的Gas(2300Gas)。