用OpenZeppelin在RSK上進行以太坊ERC20代幣開發(fā)

在本文中努咐,我們將討論通過RSK網絡部署和交互Smart-Contracts智能合約苦蒿。我們的合約將是一個基于OpenZeppelin庫的ERC20代幣,我們將把它直接部署到Mainnet中渗稍。

創(chuàng)建合約

我們需要做的第一件事就是知道如何使用Truffle佩迟。

當我們這樣做

$ truffle init

在一個空文件夾中,除了創(chuàng)建配置文件外竿屹,我們還為項目和遷移合約創(chuàng)建了文件夾存璃,以記錄對同一合約的更改掉冶。

合約的.sol代碼文件位于

~/Truffle/contracts

遷移腳本在

~/Truffle/migrations

已編譯的合約在

~/Truffle/build

測試合約在

~/Truffle/test

我們現在只處理前兩個文件夾饲齐。

在Truffle文件夾中默赂,我們從OpenZeppelin導入庫

$ npm install -E openzeppelin-solidity

這些庫不僅會安裝我們代幣token的主要類庫袍冷,還會安裝所有權相關高每,安全數學運算和許多其他設施的庫南捂。值得一提的是携狭,這些庫已經過審核以實現高標準的安全性夯膀,因此依賴于它們的合約在正確使用時不易受到黑客攻擊诗充。

我們的庫將安裝在

~/Truffle/node_modules/openzeppelin-solidity/contracts

之后,我們可以將庫ABCD.sol導入到我們的合約中诱建,如下所示:

import 'zeppelin-solidity/contracts/token/ERC20/ABCD.sol';

要創(chuàng)建我們的ERC20代幣蝴蜓,我們將從該存儲庫導入2個庫:StandardToken.sol,它具有代幣的主要功能,并且已經更多地導入了一堆庫茎匠,例如SafeMath.sol格仲;Ownable.sol,這些允許我們設置所有者對合約中的功能控制诵冒。

要繼承庫屬性和函數凯肋,我們只需使用“is”關鍵字以這種方式將合約定義為StandardTokenOwnable

contract CoinFabrikToken is StandardToken, Ownable { }

之后,我們擁有這些庫和導入庫中的所有功能汽馋。

接下來侮东,我們將代幣的名稱定義為CoinFabrik,這是它的符號豹芯,18個小數位悄雅,用于代幣的精度(以太坊類網絡中的標準,使我們有可能使用web3的以太轉換功能)并將代幣的初始供應量設置為1000铁蹈,像這樣:

string public name = 'CoinFabrik';
string public symbol = 'CF';
uint8 public decimals = 18;
uint public INITIAL_SUPPLY = 1000;

我們還將創(chuàng)建另一個字符串宽闲,一個與代幣功能無關的非公共變量,以顯示Ownable庫屬性的用法握牧,該屬性僅允許創(chuàng)建者與某些指定的函數進行交互容诬。我們稍后會看到。

已經定義了我們的參數我碟,現在是時候通過構造函數將它們分配給Token變量了放案。到目前為止,構造函數被定義為一個與智能合約同名的函數矫俺,但是從現在開始吱殉,將會有一個名為constructor()的函數,它將替換舊方法厘托。如果你像以前一樣調用構造函數友雳,Solidity編譯器將發(fā)出警告。

INITIAL_SUPPLY乘以小數精度的次方將分配給BasicToken合約的totalSupply_

totalSupply_ = INITIAL_SUPPLY * (10**uint(decimals));

并將它們存入創(chuàng)作者的帳戶:

balancesb [msg.sender] = totalSupply_;

有了這個铅匹,我們就可以使用一個簡單而標準的代幣押赊,但正如我們所說,我們將使用Ownable合約添加一些功能包斑。首先流礁,我們將定義一些函數:一個修改我們的非公共變量的狀態(tài),但只有你擁有權限罗丰,而另一個函數返回字符串的消息神帅。定義如下:

function setON(string _n) public onlyOwner returns (bool) {
    Owner = _n;
    return true;
  }
 
function getON() public view returns (string) {
    return Owner;
  }

兩者都是公開的,所以任何人都可以嘗試調用他們萌抵,但對于第一個找御,只有所有者的地址不會導致恢復元镀。如果你是所有者并且調用了函數,則字符串將保存在我們的變量Owner(帶有大寫字母)中霎桅,并且它還將返回一個我們可以在交易中檢查的true值栖疑。

由于Owner變量不是公共的并且沒有Getter,我們需要一個函數來返回變量的值而不改變區(qū)塊鏈的狀態(tài)滔驶。這是第二個功能遇革。

我們還將創(chuàng)建一個回調函數,如果有人錯誤地調用我們的合約揭糕,則會發(fā)出事件:

function () public payable {
    if (msg.value > 0) {
      emit Yes('Thanks for donating SBTC! :)');
    } else {
      emit No('Error 404: Function not found :P');
    }
}

最后澳淑,我們在合約中添加了一個可銷毀的功能,其中所有者是唯一可以執(zhí)行它的人插佛。

我們的簡單代幣已經完成杠巡。所有代碼應該是一樣的:

pragma solidity ^0.4.17;
 
import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';
import "zeppelin-solidity/contracts/ownership/Ownable.sol";
 
contract CoinFabrikToken is StandardToken, Ownable {
  string public name = 'CoinFabrik';
  string public symbol = 'CF';
  uint8 public decimals = 18;
  uint public INITIAL_SUPPLY = 1000;
 
  string Owner;
 
  event Yes(string);
  event No(string);
 
  constructor() public {
    totalSupply_ = INITIAL_SUPPLY * (10**uint(decimals));
    balances[msg.sender] = totalSupply_;
  }
 
  function setON(string _n) public onlyOwner returns (bool) {
    Owner = _n;
    return true;
  }
 
  function getON() public view returns (string) {
    return Owner;
  }
 
  function () public payable {
    if (msg.value > 0) {
      emit Yes('Thanks for donating SBTC! :)');
    } else {
      emit No('Error 404: Function not found :P');
    }
  }
 
  function destroy() public onlyOwner {
    selfdestruct(owner);
  }
 
}

創(chuàng)建遷移

對于每個合約,我們需要告訴Truffle哪個合約是我們想要部署的合約以及我們可以在哪里找到合約雇寇。這是通過/Truffle/migrations文件夾中的遷移文件完成的氢拥。

遷移腳本02_deploy_token.js應如下所示

var CoinFabrikToken = artifacts.require("./CoinFabrikToken.sol");
module.exports = function(deployer) {
  deployer.deploy(CoinFabrikToken);
};

我們已配置Truffle,我們的節(jié)點已同步锨侯,我們的合約已經編寫并且我們的遷移已配置嫩海,完成部署就是個時間問題。

部署

如果我們之前停止了我們的節(jié)點囚痴,我們將恢復在線狀態(tài)叁怪,然后我們將與Truffle連接:

$ sudo service rsk start
$ cd ~/Truffle/ && truffle console --network rsk

之后編譯合約:

truffle(rsk)> compile --all

不應該對我們的合約有任何錯誤或警告。然后我們轉移合約:

truffle(rsk)> migrate --reset

為了節(jié)約時間深滚,我們可以在一行中執(zhí)行兩個命令

truffle(rsk)> migrate --all --reset

將首先部署遷移合約奕谭。Truffle為我們提供了每個操作的交易哈希,因此我們可以稍后檢查詳細信息或日志痴荐。這是我收到的完整輸出

truffle(rsk)> migrate --all --reset
Compiling ./contracts/CoinFabrikToken.sol...
Compiling ./contracts/Migrations.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/ownership/Ownable.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
Writing artifacts to ./build/contracts
 
Using network 'rsk'.
 
Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xf00d4ecf2b5752022384f7609fe991aa72dda00a0167a974e8c69864844ae270
  Migrations: 0x1dc2550023bc8858a7e5521292356a3d42cdcbe9
Saving successful migration to network...
  ... 0x3e759e8ff8a7b8e47a441481fa5573ccf502b83f3d591ad3047e622af0f9169e
Saving artifacts...
Running migration: 2_deploy_token.js
  Deploying CoinFabrikToken...
  ... 0x300c8bb1e434e2aa4b13dcc76087d42fcbe0cb953989ca53a336c59298716433
  CoinFabrikToken: 0xc341678c01bcffa4f7362b2fceb23fbfd33373ea
Saving successful migration to network...
  ... 0x71771f7ee5d4e251e386979122bdda8728fa519d95a054572751bb10d40eb8c5
Saving artifacts...

如果我們檢查交易血柳,我們可以計算所有部署過程的gas成本。在我這里的情況生兆,它是2340788gas(277462+42008+1994310+27008)难捌。

因此將其更改為真實的SBTC,我們得到2340788*183000000/10^18=0,000428364 SBTC鸦难。在撰寫本文時根吁,這大約是4美元左右。

我們的合約現在部署在0xc341678c01bcffa4f7362b2fceb23fbfd33373ea合蔽。

恭喜击敌!

與合約互動

通過Truffle遷移給出的地址,以及合約的ABI辈末,我們創(chuàng)建了一個實例愚争,因此簡化語法更容易處理函數。為此挤聘,在我們部署之后轰枝,我們寫了

truffle(rsk)> var cfToken = web3.eth.contract(CoinFabrikToken.abi).at(CoinFabrikToken.address)

如果合約已經部署,并且知道它的地址和ABI组去,我們就可以做到

truffle(rsk)> var cfToken = web3.eth.contract(‘Contract_ABI’).at(‘Contract_ADDRESS’)

其中Contract_ABI是簡化為一行ABI鞍陨,Contract_ADDRESS不需要解釋。

我之前創(chuàng)建了2個帳戶从隆,現在為方便起見诚撵,我們將它們重命名:

truffle(rsk)> var acc0 = web3.eth.accounts[0]
truffle(rsk)> var acc1 = web3.eth.accounts[1]

acc0是部署合約的人。Acc0被添加到truffle.jsnode.conf配置文件中键闺。

所有權控制

我們將首先使用我們討論過的庫來測試合約的所有權功能寿烟。

如果我們從任何帳戶調用getON函數,只要它是公開的并且沒有任何所有權問題辛燥,我們就會得到:

truffle(rsk)> cfToken.getON()
''

現在筛武,setON函數具有所有權屬性。任何來自其他帳戶的交易都將被駁回挎塌。例如徘六,我們看到,試圖用我的名字從acc1簽訂合約不會改變它的價值榴都。

truffle(rsk)> cfToken.setON('Andres Bachfischer', {from: acc1})
0x5f115190b60238240bedf36d1c5bb69a443a0f8ee971b0fc40fe5ca9c727d47c
image

使用交易的哈希待锈,我們看到返回的值為false,并且函數未正確執(zhí)行嘴高。再次調用getON函數竿音,我們看到變量沒有改變它的值。

現在簽署相同的交易但是從所有者的帳戶acc0拴驮,我們得到狀態(tài)'0x01'并且該功能正確執(zhí)行谍失。

truffle(rsk)> cfToken.setON('Andres Bachfischer', {from: acc0})
0x0c894fa7e5369573fb14addeaed4cd9d5b6cd1425cb4eeeae16cb4e1fa8e0364
image

再次調用函數getON,我們看到所有權庫按照我們希望的那樣工作莹汤。

truffle(rsk)> cfToken.getON()
image

Ownable.sol還具有允許我們將合約所有者更改為其他地址的功能快鱼。我們不會用它。然而纲岭,它的用法如下:

truffle(rsk)> cfToken.transferOwnership(acc1, {from: acc0}) 

有了這個抹竹,acc1將成為合約的新所有者。

讓我們轉到代幣止潮。

代幣操作

我們要做的第一件事是檢查在創(chuàng)建合約時是否正確分配了代幣的余額窃判。

我們檢查每個帳戶的余額如下:

web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = ‘1000’
web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = ‘0’

因此,我們可以看到所有代幣都已正確分配到我們的初始帳戶喇闸。

我們要做的第一筆交易是將一些代幣轉移到第二個帳戶acc1袄琳,進行三次询件。

為第一筆交易這樣做:

truffle(rsk)> cfToken.transfer(acc1, web3.toWei(88.8), {from: acc0})
0xd45437b777f1430e7cec57bd80b261ce8f87bf8a3f9a113fecd20563403c4d9c
image
truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = '733.6'
truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = '266.4'
image

我們看到從我們的部署帳戶中獲取的代幣與在acc1中收到的代幣數量相同。

使用StandardToken合約唆樊,我們還獲得了代表某個帳戶(在本例中為acc1)支出代幣的權限宛琅。如果我們想在獲得批準之前執(zhí)行此操作,則交易將失敹号浴(狀態(tài)為“0x00”)

truffle(rsk)> cfToken.transferFrom(acc1, acc0, web3.toWei(5), {from: acc0})
0x5cee7cf60849283a0088d71483a606ba2101b500e13f972abada4f75781596bf
image

檢查后嘿辟,acc0不允許從acc1發(fā)送:

truffle(rsk)> web3.fromWei(cfToken.allowance(acc1, acc0, {from: acc0}).toString(10)) // = '0'

我們授權acc0acc1的交易中以acc1的名義花費10個代幣:

truffle(rsk)> cfToken.approve(acc0, web3.toWei(10), {from: acc1})
0x6e1a202f4ca7f43dfb28034952d54a572993b986a55857790aa51854afbc1fb4
image

在輸出日志中,我們看到函數已成功完成片效,并且日志顯示允許acc0用于支出的金額红伦。檢查allowance:

truffle(rsk)> web3.fromWei(cfToken.allowance(acc1, acc0, {from: acc0}).toString(10)) // = '10'
image

現在,如果我們再次執(zhí)行支出交易:

truffle(rsk)> cfToken.transferFrom(acc1, acc0, web3.toWei(5), {from: acc0})
0x41f750eabb6e0d3ab576aac0333b0d337ca61808aae1eeafa9d8e2a0b81b979b

我們得到狀態(tài)為“0x01”的成功交易淀衣。

image

再檢查一下余額:

truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = '738.6'
truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = '261.4'
image

最后昙读,如果我們簽署一個調用不可用函數的事務,我們將調用我們的回退函數膨桥。 簽署一個像這樣的交易:

truffle(rsk)> web3.eth.sendTransaction({from: acc0, to: cfToken.address})
0x4106a287fc60669bf9682a73ec4c457b094c086ec7408a5dea95d200688c4ee9
image

將返回一個日志箕戳,其數據表示字符串Error 404:Function not found:P(十六進制:'0x00 ... 00204572726f72203430343a2046756e6374696f6e206e6f7420666f756e64203a50')。

我們的最后一個功能国撵,即我們不會因為顯而易見的原因而執(zhí)行陵吸,就是銷毀功能。我們需要合約不被銷毀才能顯示交易介牙。要調用壮虫,所有者應該這樣做:

truffle(rsk)> cfToken.destroy({from: acc0})

結論

在演練的第二部分中,我展示了在RSK網絡中開發(fā)簡單智能合約的示例环础。 我們已經看過:

  • 從OpenZeppelin套件導入庫和合約囚似,
  • 使用這些庫創(chuàng)建一個簡單的代幣,
  • 配置Truffle的遷移過程线得,
  • 將我們的合約部署到RSK主網絡饶唤,
  • 通過不同的賬戶與合約互動,
  • 檢查塊的日志以獲取有關事務的反饋贯钩。

正如我們所看到的募狂,RSK網絡用于Solidity Smart Contracts部署和交互的用法幾乎與以太坊節(jié)點中的相同。當然角雷,這仍然是一個測試網絡祸穷,預計會出現問題和錯誤,主要是在節(jié)點中勺三,但RSK Labs團隊在他們出現時盡可能快地解決它們雷滚。隨著時間的推移,將實現穩(wěn)健性吗坚。

======================================================================

分享一些以太坊祈远、EOS呆万、比特幣等區(qū)塊鏈相關的交互式在線編程實戰(zhàn)教程:

  • java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解车份。
  • python以太坊谋减,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
  • php以太坊躬充,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建讨便、交易充甚、轉賬、代幣開發(fā)以及過濾器和交易等內容霸褒。
  • 以太坊入門教程伴找,主要介紹智能合約與dapp應用開發(fā),適合入門废菱。
  • 以太坊開發(fā)進階教程技矮,主要是介紹使用node.js、mongodb殊轴、區(qū)塊鏈衰倦、ipfs實現去中心化電商DApp實戰(zhàn),適合進階旁理。
  • C#以太坊樊零,主要講解如何使用C#開發(fā)基于.Net的以太坊應用,包括賬戶管理孽文、狀態(tài)與交易驻襟、智能合約開發(fā)與交互、過濾器和交易等芋哭。
  • EOS教程沉衣,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應用的開發(fā),內容涵蓋EOS工具鏈减牺、賬戶與錢包豌习、發(fā)行代幣、智能合約開發(fā)與部署拔疚、使用代碼與智能合約交互等核心知識點斑鸦,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。
  • java比特幣開發(fā)教程草雕,本課程面向初學者巷屿,內容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲墩虹、去中心化共識機制嘱巾、密鑰與腳本憨琳、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能旬昭,例如創(chuàng)建地址篙螟、管理錢包、構造裸交易等问拘,是Java工程師不可多得的比特幣開發(fā)學習課程遍略。
  • php比特幣開發(fā)教程,本課程面向初學者骤坐,內容即涵蓋比特幣的核心概念绪杏,例如區(qū)塊鏈存儲、去中心化共識機制纽绍、密鑰與腳本蕾久、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能拌夏,例如創(chuàng)建地址僧著、管理錢包、構造裸交易等障簿,是Php工程師不可多得的比特幣開發(fā)學習課程盹愚。
  • tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進行區(qū)塊鏈開發(fā)的工程師站故,課程內容即包括tendermint應用開發(fā)模型中的核心概念杯拐,例如ABCI接口、默克爾樹世蔗、多版本狀態(tài)庫等端逼,也包括代幣發(fā)行等豐富的實操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇污淋。

匯智網原創(chuàng)翻譯顶滩,轉載請標明出處。這里是原文使用OpenZeppelin在RSK上進行ERC20代幣開發(fā)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末寸爆,一起剝皮案震驚了整個濱河市礁鲁,隨后出現的幾起案子,更是在濱河造成了極大的恐慌赁豆,老刑警劉巖仅醇,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異魔种,居然都是意外死亡析二,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叶摄,“玉大人属韧,你說我怎么就攤上這事「蛳牛” “怎么了宵喂?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長会傲。 經常有香客問我锅棕,道長,這世上最難降的妖魔是什么淌山? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任裸燎,我火速辦了婚禮,結果婚禮上艾岂,老公的妹妹穿的比我還像新娘顺少。我一直安慰自己朋其,他們只是感情好王浴,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梅猿,像睡著了一般氓辣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袱蚓,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天钞啸,我揣著相機與錄音,去河邊找鬼喇潘。 笑死体斩,一個胖子當著我的面吹牛,可吹牛的內容都是我干的颖低。 我是一名探鬼主播絮吵,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忱屑!你這毒婦竟也來了蹬敲?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤莺戒,失蹤者是張志新(化名)和其女友劉穎伴嗡,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體从铲,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡瘪校,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了名段。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣淤。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赏寇,死狀恐怖,靈堂內的尸體忽然破棺而出价认,到底是詐尸還是另有隱情嗅定,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布用踩,位于F島的核電站渠退,受9級特大地震影響,放射性物質發(fā)生泄漏脐彩。R本人自食惡果不足惜碎乃,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠奸。 院中可真熱鬧梅誓,春花似錦、人聲如沸佛南。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗅回。三九已至及穗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绵载,已是汗流浹背埂陆。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娃豹,地道東北人焚虱。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像懂版,于是被迫代替她去往敵國和親鹃栽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容