在部署運(yùn)行Chainlink節(jié)點(diǎn)預(yù)言機(jī)合約的過程中,會(huì)涉及到很多的地址與賬戶,今天我們就來解釋一下這些地址和賬戶分別的做什么用的。
合約相關(guān)
首先介紹一下以太坊賬戶相關(guān)的基礎(chǔ)知識(shí)。
我們知道,以太坊上的賬戶分為外部賬戶(EOA, externally owned accounts)和合約賬戶(CA, contract accounts),外部賬戶就是我們普通用戶掌握私鑰的賬戶,可以用來存儲(chǔ)、轉(zhuǎn)賬代幣,也可以用來創(chuàng)建部署智能合約。在創(chuàng)建智能合約之后,合約也會(huì)擁有一個(gè)地址,這個(gè)地址和外部賬戶的地址在形式上沒有區(qū)別(都是0x開頭的16進(jìn)制字符串),但是合約賬戶沒有私鑰,它通過外部賬戶提交transaction的方式去調(diào)用。雖然合約賬戶沒有私鑰,但是合約賬戶卻可以持有資金,它的資金和一些重要的權(quán)限操作可以被其擁有者owner所控制。一般來說,owner是創(chuàng)建合約的外部賬戶,但是owner也可以被最初的創(chuàng)建者轉(zhuǎn)移給其他賬戶。
我們?cè)诓渴鸸?jié)點(diǎn)的時(shí)候,都會(huì)部署一個(gè)代表我們節(jié)點(diǎn)在鏈上執(zhí)行request和fulfill的oracle合約。我們部署合約所用到的外部賬戶,其私鑰必須妥善保管,因?yàn)樗鼘?duì)于oracle合約有強(qiáng)有力的控制權(quán),可以設(shè)置節(jié)點(diǎn)調(diào)用的權(quán)限,更重要的是它可以控制合約賬戶所持有的資金,具體來說就是LINK token。
我們可以看這個(gè)oracle合約中
/**
* @notice Sets the fulfillment permission for a given node. Use `true` to allow, `false` to disallow.
* @param _node The address of the Chainlink node
* @param _allowed Bool value to determine if the node can fulfill requests
*/
function setFulfillmentPermission(address _node, bool _allowed) external onlyOwner {
authorizedNodes[_node] = _allowed;
}
/**
* @notice Allows the node operator to withdraw earned LINK to a given address
* @dev The owner of the contract can be another wallet and does not have to be a Chainlink node
* @param _recipient The address to send the LINK token to
* @param _amount The amount to send (specified in wei)
*/
function withdraw(address _recipient, uint256 _amount)
external
onlyOwner
hasAvailableFunds(_amount)
{
withdrawableTokens = withdrawableTokens.sub(_amount);
assert(LinkToken.transfer(_recipient, _amount));
}
/**
* @notice Displays the amount of LINK that is available for the node operator to withdraw
* @dev We use `ONE_FOR_CONSISTENT_GAS_COST` in place of 0 in storage
* @return The amount of withdrawable LINK on the contract
*/
function withdrawable() external view onlyOwner returns (uint256) {
return withdrawableTokens.sub(ONE_FOR_CONSISTENT_GAS_COST);
}
source: https://github.com/smartcontractkit/chainlink/blob/develop/evm/contracts/Oracle.sol#L187
setFulfillmentPermission、withdraw、withdrawable三個(gè)方法都是只有owner(所有者)才能調(diào)用的。其中withdraw方法,可以理解為一個(gè)提幣的方法,它將合約賬戶持有的LINK token轉(zhuǎn)移到其他賬戶。所以owner賬戶非常重要,一定要妥善保管。
節(jié)點(diǎn)相關(guān)
我們?cè)诎凑瘴臋nhttps://docs.chain.link/docs/running-a-chainlink-node部署節(jié)點(diǎn)的時(shí)候,也會(huì)遇到很多賬戶。我們以docker方式啟動(dòng)為例,介紹一下這些賬戶的作用。
節(jié)點(diǎn)擁有一個(gè)以太坊的外部賬戶,這個(gè)賬戶會(huì)持有一定數(shù)量的ETH,用于提交調(diào)用oracle合約的事務(wù)時(shí)支付以太坊網(wǎng)絡(luò)的交易費(fèi)用。這個(gè)賬戶是在初次啟動(dòng)chainlink的實(shí)例的時(shí)候生成的。
我們?cè)诘谝淮螁?dòng)chainlink示例的時(shí)候,比如在執(zhí)行
cd ~/.chainlink-ropsten && docker run -p 6688:6688 -v ~/.chainlink-ropsten:/chainlink -it --env-file=.env smartcontract/chainlink local n
命令之后,首先會(huì)要求我們輸入兩遍密碼(輸入和確認(rèn)),這個(gè)密碼其實(shí)就是節(jié)點(diǎn)所擁有的以太賬戶的keystore的passphrase,必須要牢記,如果丟失了無法找回。
如果我們想把節(jié)點(diǎn)的賬戶地址上的ETH提出來應(yīng)該怎么操作呢。我們需要找到這個(gè)keystore。如果你是按照官方文檔的方式創(chuàng)建的節(jié)點(diǎn),keystore會(huì)保存在你的節(jié)點(diǎn)所在的服務(wù)器的~/.chainlink/tempkey目錄下(即Chainlink節(jié)點(diǎn)運(yùn)行的主目錄下的tempkey目錄,請(qǐng)跟據(jù)自己節(jié)點(diǎn)的部署情況更改路徑)。需要注意想要查看keystore內(nèi)容需要你有服務(wù)器的sudo權(quán)限。拿到keystore后,就可以在你喜歡的以太坊錢包上用上面提到的密碼導(dǎo)入了。
第一次啟動(dòng)chainlink示例的時(shí)候,在輸入keystore的密鑰之后,還會(huì)要求你輸入一個(gè)賬戶和密碼,這個(gè)賬戶密碼是chainlink提供的web管理界面的登錄用戶名密碼。這個(gè)賬戶的密碼可以按照這篇文檔提供的方式來修改。https://docs.chain.link/docs/miscellaneous#section-change-your-api-password
總結(jié)
本文我們介紹了Chainlink節(jié)點(diǎn)運(yùn)營(yíng)相關(guān)的4個(gè)賬戶,分別是
· 部署合約的外部賬戶:用于部署Oracle合約,默認(rèn)情況下是Oracle合約的Owner(所有者),掌管著賬戶本身的資金和Oracle合約所持有的資金
· Oracle合約賬戶:沒有私鑰,其持有的資金,以及合約的一些重要方法,受其Owner控制
· 節(jié)點(diǎn)所持有的外部賬戶:持有部分ETH,用于在提交完成請(qǐng)求的事務(wù)時(shí)支付交易費(fèi)用,可以在需要時(shí)將其賬戶持有資金提出。
來源: Chainlink資訊?
評(píng)論
查看更多