如果一个函数需要进行货币操作,必须要带上payable
关键字,这样才能正常接收msg.value
keccak256(...) returns (bytes32) // 使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。
库可以被看作是使用它的合约的一个隐式的父类
using C for string;
library C {
function a() returns (address) {
return address(this);
}
}
contract A {
function a(string cc) constant returns (address) {
return cc.a();
}
}
fallback function,当有人
external
,public
,internal
,private
MoreSolidity为函数提供了四种可见性:external
,public
,internal
,private
。
声明为external的可以从其它合约或通过Transaction进行调用,所以声明为external的函数是合约对外接口的一部分。
函数默认声明为public。
public的函数既允许以internal的方式调用,也允许以external的方式调用。
在当前的合约或继承的合约中,只允许以internal的方式调用。
只能在当前合约中被访问(不可在被继承的合约中访问)。
我们可以在合约的调用函数前加this.来强制以external方式的调用。需要注意的是这里的this的用法与大多数语言的都不一致。
pragma solidity ^0.4.0;
contract A{
function f() internal{}
function callInternally(){
f();
}
//以`external`的方式调用
//f()只能以`internal`的方式调用
//Untitled3:7:9: Error: Member "f" not found or not visible after argument-dependent lookup in contract A
function callExternally(){
//this.f();
}
}
memory
, storage
, calldata
More默认的函数参数,包括返回的参数,他们是memory
pragma solidity ^0.4.0;
contract SimpleAssign{
struct S{string a;uint b;}
//默认参数是memory
function assign(S s) internal{
//默认的变量是storage的指针
//Type struct MemoryToLocalVar.S memory is not implicitly convertible to expected type struct MemoryToLocalVar.S storage pointer.
//S tmp = s;
}
}
存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。
memory之间是引用传递,并不会拷贝数据。
默认的局部变量是storage的。
数据将永远存在于区块链上。
一般只有外部函数的参数(不包括返回参数)被强制指定为calldata.这种数据位置是只读的,不会持久化到区块链。
right?
F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
相当于
F3Ddatasets.EventReturns memory _eventData_;
_eventData_ = determinePID(_eventData_);
<>