在 Conflux Studio 的任意界面,點(diǎn)擊應(yīng)用左下?的鑰匙圖標(biāo),打開(kāi)密鑰管理器。點(diǎn)擊 Create 按鈕打開(kāi)新鑰匙對(duì)彈窗,輸入鑰匙對(duì)的名字并點(diǎn)擊 Save 按鈕。完成后將在密鑰管理器中看到剛剛生成的鑰匙對(duì)的地址。鑰匙對(duì)由私鑰和公鑰組成,公鑰在智能合約中也常被稱作地址。
// 指定了 Solidity 的版本,通過(guò) Pragmas(https://solidity.readthedocs.io/en/latest/layout-of-source-files.html#pragmas) 告訴編譯器本代碼可以兼容的版本為 0.5.0 到 0.7.0
pragma solidity >=0.5.0 <0.7.0;
// 導(dǎo)入 SponsorWhitelistControl 合約
import "./SponsorWhitelistControl.sol";
// 定義 Coin 的合約
contract Coin {
// 定義了兩個(gè) State Variables(https://solidity.readthedocs.io/en/latest/structure-of-a-contract.html#state-variables)
address public minter;
mapping (address => uint) private balances;
// 使用 SponsorWhitelistControl 合約連接系統(tǒng)合約
SponsorWhitelistControl constant private SPONSOR = SponsorWhitelistControl(address(0x0888000000000000000000000000000000000001));
// 定義了 `Sent` 的事件,定義了 from / to / amount 列
event Sent(address from, address to, uint amount);
// Coin 合約的 constructor ,在 constructor 中指定了 minter 的地址
constructor() public {
// msg.sender 為部署合約時(shí)簽名的賬戶地址,將這個(gè)地址賦值給 minter
minter = msg.sender;
}
// 定義 mint 方法,通過(guò)此方法來(lái)增發(fā)代幣
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
require(amount < 1e60);
balances[receiver] += amount;
}
// 定義 send 方法,通過(guò)此方法可以給別的賬戶轉(zhuǎn)賬代幣
function send(address receiver, uint amount) public {
require(amount <= balances[msg.sender], "Insufficient balance.");
balances[msg.sender] -= amount;
balances[receiver] += amount;
// 通過(guò) emit 觸發(fā) Sent 事件,記錄這筆轉(zhuǎn)賬的信息
emit Sent(msg.sender, receiver, amount);
}
// 定義 balanceOf 方法,這是個(gè) view 類(lèi)型的方法,用于查詢賬戶余額
function balanceOf(address tokenOwner) public view returns(uint balance){
return balances[tokenOwner];
}
// 定義了 add_privilege 方法,調(diào)用系統(tǒng)合約 add_privilege 方法添加地址到代付白名單
function add_privilege(address account) public payable {
address[] memory a = new address[](1);
a[0] = account;
SPONSOR.add_privilege(a);
}
// 定義了 remove_privilege 方法,調(diào)用系統(tǒng)合約 remove_privilege 從合約代付白名單中移除地址
function remove_privilege(address account) public payable {
address[] memory a = new address[](1);
a[0] = account;
SPONSOR.remove_privilege(a);
}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
編譯及部署合約
點(diǎn)擊工具欄的 Build 按鈕進(jìn)行合約的編譯,編譯的結(jié)果將會(huì)保存在 build/Coin.json 文件中。
在部署合約前,首先需要確認(rèn)在 Explorer 中選擇合約部署所使用的地址,Conflux Studio 會(huì)使用這個(gè)地址將部署合約這筆交易進(jìn)行簽名(選擇的方法為在 Explorer 的地址欄中輸入地址)。在合約代碼的 constructor 中,minter 被賦值為 msg.sender,這個(gè) msg.sender 就是 Explorer 所選擇的地址。
Conflux 智能合約的每個(gè)調(diào)用的方法都可以帶上 Value 參數(shù),這是一個(gè)可選的參數(shù)。如果帶上了這個(gè)值,智能合約出了在執(zhí)行這個(gè)方法的邏輯外,還會(huì)額外轉(zhuǎn) Value 中指定數(shù)量的 CFX token 到 receiver 賬戶,轉(zhuǎn)賬金額為 Value 中所填的值。有些智能合約的方法需要這個(gè)參數(shù)才可以完成調(diào)用,但是在 Coin 合約不需要這個(gè)參數(shù)。
在事件區(qū)域選擇 Sent 并點(diǎn)擊執(zhí)行,下方的 Event Logs 可以看到轉(zhuǎn)賬的記錄。Sent 事件的列都是由代碼中的 Sent 事件的參數(shù)來(lái)定義的(其中 epoch 為事件發(fā)生的時(shí)間,這個(gè)為系統(tǒng)默認(rèn)列)。在代碼中定義了 Sent 方法的參數(shù)為 from, to 和 amount,分別對(duì)應(yīng)了這筆轉(zhuǎn)賬的發(fā)起者地址,接受者地址以及轉(zhuǎn)賬的數(shù)量。
FC 賞金分配方案會(huì)展示在賞金任務(wù)詳情頁(yè)中,包括最高獎(jiǎng)金數(shù)量、獎(jiǎng)金分配人數(shù)、獎(jiǎng)金數(shù)量分布、排行名次確定方式等信息。賬號(hào)余額中的賞金獎(jiǎng)勵(lì)可以隨時(shí)申請(qǐng)?zhí)岈F(xiàn)至 Conflux 錢(qián)包。Conflux 團(tuán)隊(duì)會(huì)對(duì)所有的提現(xiàn)申請(qǐng)進(jìn)行審核。
黑曜石實(shí)驗(yàn)室(Obsidian Labs) 是全球最大的區(qū)塊鏈開(kāi)發(fā)工具(IDE)提供商,也是 Conflux Studio 的開(kāi)發(fā)團(tuán)隊(duì),致力于為區(qū)塊鏈開(kāi)發(fā)者提供必備的工具及服務(wù),幫助鏈上應(yīng)用生態(tài)快速發(fā)展。目前,除了 Conflux Studio 外,Obsidian Labs 還為 EOS、Nervos、Substrate、Alogorand 等明星項(xiàng)目提供了專屬的 IDE 和框架工具。