在部署運行Chainlink節(jié)點預言機合約的過程中,會涉及到很多的地址與賬戶,今天我們就來解釋一下這些地址和賬戶分別的做什么用的。
合約相關
首先介紹一下以太坊賬戶相關的基礎知識。
我們知道,以太坊上的賬戶分為外部賬戶(EOA, externally owned accounts)和合約賬戶(CA, contract accounts),外部賬戶就是我們普通用戶掌握私鑰的賬戶,可以用來存儲、轉(zhuǎn)賬代幣,也可以用來創(chuàng)建部署智能合約。在創(chuàng)建智能合約之后,合約也會擁有一個地址,這個地址和外部賬戶的地址在形式上沒有區(qū)別(都是0x開頭的16進制字符串),但是合約賬戶沒有私鑰,它通過外部賬戶提交transaction的方式去調(diào)用。雖然合約賬戶沒有私鑰,但是合約賬戶卻可以持有資金,它的資金和一些重要的權限操作可以被其擁有者owner所控制。一般來說,owner是創(chuàng)建合約的外部賬戶,但是owner也可以被最初的創(chuàng)建者轉(zhuǎn)移給其他賬戶。
我們在部署節(jié)點的時候,都會部署一個代表我們節(jié)點在鏈上執(zhí)行request和fulfill的oracle合約。我們部署合約所用到的外部賬戶,其私鑰必須妥善保管,因為它對于oracle合約有強有力的控制權,可以設置節(jié)點調(diào)用的權限,更重要的是它可以控制合約賬戶所持有的資金,具體來說就是LINK token。
我們可以看這個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三個方法都是只有owner(所有者)才能調(diào)用的。其中withdraw方法,可以理解為一個提幣的方法,它將合約賬戶持有的LINK token轉(zhuǎn)移到其他賬戶。所以owner賬戶非常重要,一定要妥善保管。
節(jié)點相關
我們在按照文檔https://docs.chain.link/docs/running-a-chainlink-node部署節(jié)點的時候,也會遇到很多賬戶。我們以docker方式啟動為例,介紹一下這些賬戶的作用。
節(jié)點擁有一個以太坊的外部賬戶,這個賬戶會持有一定數(shù)量的ETH,用于提交調(diào)用oracle合約的事務時支付以太坊網(wǎng)絡的交易費用。這個賬戶是在初次啟動chainlink的實例的時候生成的。
我們在第一次啟動chainlink示例的時候,比如在執(zhí)行
cd ~/.chainlink-ropsten && docker run -p 6688:6688 -v ~/.chainlink-ropsten:/chainlink -it --env-file=.env smartcontract/chainlink local n
命令之后,首先會要求我們輸入兩遍密碼(輸入和確認),這個密碼其實就是節(jié)點所擁有的以太賬戶的keystore的passphrase,必須要牢記,如果丟失了無法找回。
如果我們想把節(jié)點的賬戶地址上的ETH提出來應該怎么操作呢。我們需要找到這個keystore。如果你是按照官方文檔的方式創(chuàng)建的節(jié)點,keystore會保存在你的節(jié)點所在的服務器的~/.chainlink/tempkey目錄下(即Chainlink節(jié)點運行的主目錄下的tempkey目錄,請跟據(jù)自己節(jié)點的部署情況更改路徑)。需要注意想要查看keystore內(nèi)容需要你有服務器的sudo權限。拿到keystore后,就可以在你喜歡的以太坊錢包上用上面提到的密碼導入了。
第一次啟動chainlink示例的時候,在輸入keystore的密鑰之后,還會要求你輸入一個賬戶和密碼,這個賬戶密碼是chainlink提供的web管理界面的登錄用戶名密碼。這個賬戶的密碼可以按照這篇文檔提供的方式來修改。https://docs.chain.link/docs/miscellaneous#section-change-your-api-password
總結(jié)
本文我們介紹了Chainlink節(jié)點運營相關的4個賬戶,分別是
· 部署合約的外部賬戶:用于部署Oracle合約,默認情況下是Oracle合約的Owner(所有者),掌管著賬戶本身的資金和Oracle合約所持有的資金
· Oracle合約賬戶:沒有私鑰,其持有的資金,以及合約的一些重要方法,受其Owner控制
· 節(jié)點所持有的外部賬戶:持有部分ETH,用于在提交完成請求的事務時支付交易費用,可以在需要時將其賬戶持有資金提出。
來源: Chainlink資訊?
評論
查看更多