contract C {
function f(uint a) private returns (uint b) { return a + 1; }
function setData(uint a) internal { data = a; }
uint public data;
}
1
2
3
4
5
6
7
在上面的例子中,D可以调用c.getData()来取出data的值。但是不能调用f.合约e是从c派生出来的,能调用compute.
// 这不会编译
pragma solidity ^0.4.0;
contract C {
uint private data;
function f(uint a) private returns(uint b) { return a + 1; }
function setData(uint a) { data = a; }
function getData() public returns(uint) { return data; }
function compute(uint a, uint b) internal returns (uint) { return a+b; }
}
contract D {
function readData() {
C c = new C();
uint local = c.f(7); // 错误:成员“f”不可见
c.setData(3);
local = c.getData();
local = c.compute(3, 5); // 错误:成员“compute”是不可见的
}
}
contract E is C {
function g() {
C c = new C();
uint val = compute(3, 5); // 访问内部成员(从派生到父合约)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
getter函数
function data(uint arg1, bool arg2, uint arg3) returns (uint a, bytes3 b) {
a = data[arg1][arg2][arg3].a;
b = data[arg1][arg2][arg3].b;
}
1
2
3
4
请注意,结构中的映射被省略,因为没有提供映射密钥的好方法。
库与合约类似,但其目的是在特定地址部署一次,并使用EVM的DELEGATECALL(CALLCODE until Homestead)功能重用其代码。 这意味着如果调用库函数,则它们的代码在呼叫契约的上下文中执行,即这指向呼叫合同,特别是可以访问来自呼叫合同的存储。 由于库是孤立的源代码,所以只有明确提供调用契约的状态变量才可以访问(否则就无法命名)。
function fromUint(uint x) internal returns (bigint r) {
r.limbs = new uint[](1);
r.limbs[0] = x;
}
function add(bigint _a, bigint _b) internal returns (bigint r) {
r.limbs = new uint[](max(_a.limbs.length, _b.limbs.length));
uint carry = 0;
for (uint i = 0; i < r.limbs.length; ++i) {
uint a = limb(_a, i);
uint b = limb(_b, i);
r.limbs[i] = a + b + carry;
if (a + b < a || (a + b == uint(-1) && carry > 0))
carry = 1;
else
carry = 0;
}
if (carry > 0) {
// too bad, we have to add a limb
uint[] memory newLimbs = new uint[](r.limbs.length + 1);
for (i = 0; i < r.limbs.length; ++i)
newLimbs[i] = r.limbs[i];
newLimbs[i] = carry;
r.limbs = newLimbs;
}
}