什么是库:
在Solidity中,库和合约有点类似,你可以把库理解成Java中只包含static函数的类。它的作用和目的是代码复用。和普通合约有点不同的是,Library中无法包含storage变量。
创建和使用库:
下面的Library,有一个包含mapping的数据结构,并且提供了查询和插入的功能。注意在函数中传入的Data都加入了storage关键字,这里是传入了一个Data的引用。
// Code for StringToUintMap.sol
pragma solidity ^0.4.15;
library StringToUintMap {
struct Data {
mapping (string => uint8) map;
}
function insert(
Data storage self,
string key,
uint8 value) public returns (bool updated)
{
require(value > 0);
updated = self.map[key] != 0;
self.map[key] = value;
}
function get(Data storage self, string key) public returns (uint8) {
return self.map[key];
}
}
下面的合约使用了StringToUintMap,在使用这个合约之前,Library必须先被部署,然后再指定Library部署的地址,这个过程叫链接(Linking)
// Code for PersonsAge.sol
pragma solidity ^0.4.15;
import { StringToUintMap } from "../libraries/StringToUintMap.sol";
contract PersonsAge {
StringToUintMap.Data private _stringToUintMapData;
event PersonAdded(string name, uint8 age);
event GetPersonAgeResponse(string name, uint8 age);
function addPersonAge(string name, uint8 age) public {
StringToUintMap.insert(_stringToUintMapData, name, age);
PersonAdded(name, age);
}
function getPersonAge(string name) public returns (uint8) {
uint8 age = StringToUintMap.get(_stringToUintMapData, name);
GetPersonAgeResponse(name, age);
return age;
}
}