基于以太坊賬戶(hù)相關(guān)的基礎(chǔ)知識(shí)解析
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在部署運(yùn)行Chainlink節(jié)點(diǎn)預(yù)言機(jī)合約的過(guò)程中,會(huì)涉及到很多的地址與賬戶(hù),今天我們就來(lái)解釋一下這些地址和賬戶(hù)分別的做什么用的。
合約相關(guān)
首先介紹一下以太坊賬戶(hù)相關(guān)的基礎(chǔ)知識(shí)。
我們知道,以太坊上的賬戶(hù)分為外部賬戶(hù)(EOA, externally owned accounts)和合約賬戶(hù)(CA, contract accounts),外部賬戶(hù)就是我們普通用戶(hù)掌握私鑰的賬戶(hù),可以用來(lái)存儲(chǔ)、轉(zhuǎn)賬代幣,也可以用來(lái)創(chuàng)建部署智能合約。在創(chuàng)建智能合約之后,合約也會(huì)擁有一個(gè)地址,這個(gè)地址和外部賬戶(hù)的地址在形式上沒(méi)有區(qū)別(都是0x開(kāi)頭的16進(jìn)制字符串),但是合約賬戶(hù)沒(méi)有私鑰,它通過(guò)外部賬戶(hù)提交transaction的方式去調(diào)用。雖然合約賬戶(hù)沒(méi)有私鑰,但是合約賬戶(hù)卻可以持有資金,它的資金和一些重要的權(quán)限操作可以被其擁有者owner所控制。一般來(lái)說(shuō),owner是創(chuàng)建合約的外部賬戶(hù),但是owner也可以被最初的創(chuàng)建者轉(zhuǎn)移給其他賬戶(hù)。
我們?cè)诓渴鸸?jié)點(diǎn)的時(shí)候,都會(huì)部署一個(gè)代表我們節(jié)點(diǎn)在鏈上執(zhí)行request和fulfill的oracle合約。我們部署合約所用到的外部賬戶(hù),其私鑰必須妥善保管,因?yàn)樗鼘?duì)于oracle合約有強(qiáng)有力的控制權(quán),可以設(shè)置節(jié)點(diǎn)調(diào)用的權(quán)限,更重要的是它可以控制合約賬戶(hù)所持有的資金,具體來(lái)說(shuō)就是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è)提幣的方法,它將合約賬戶(hù)持有的LINK token轉(zhuǎn)移到其他賬戶(hù)。所以owner賬戶(hù)非常重要,一定要妥善保管。
節(jié)點(diǎn)相關(guān)
我們?cè)诎凑瘴臋nhttps://docs.chain.link/docs/running-a-chainlink-node部署節(jié)點(diǎn)的時(shí)候,也會(huì)遇到很多賬戶(hù)。我們以docker方式啟動(dòng)為例,介紹一下這些賬戶(hù)的作用。
節(jié)點(diǎn)擁有一個(gè)以太坊的外部賬戶(hù),這個(gè)賬戶(hù)會(huì)持有一定數(shù)量的ETH,用于提交調(diào)用oracle合約的事務(wù)時(shí)支付以太坊網(wǎng)絡(luò)的交易費(fèi)用。這個(gè)賬戶(hù)是在初次啟動(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)所擁有的以太賬戶(hù)的keystore的passphrase,必須要牢記,如果丟失了無(wú)法找回。
如果我們想把節(jié)點(diǎn)的賬戶(hù)地址上的ETH提出來(lái)應(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后,就可以在你喜歡的以太坊錢(qián)包上用上面提到的密碼導(dǎo)入了。
第一次啟動(dòng)chainlink示例的時(shí)候,在輸入keystore的密鑰之后,還會(huì)要求你輸入一個(gè)賬戶(hù)和密碼,這個(gè)賬戶(hù)密碼是chainlink提供的web管理界面的登錄用戶(hù)名密碼。這個(gè)賬戶(hù)的密碼可以按照這篇文檔提供的方式來(lái)修改。https://docs.chain.link/docs/miscellaneous#section-change-your-api-password
總結(jié)
本文我們介紹了Chainlink節(jié)點(diǎn)運(yùn)營(yíng)相關(guān)的4個(gè)賬戶(hù),分別是
· 部署合約的外部賬戶(hù):用于部署Oracle合約,默認(rèn)情況下是Oracle合約的Owner(所有者),掌管著賬戶(hù)本身的資金和Oracle合約所持有的資金
· Oracle合約賬戶(hù):沒(méi)有私鑰,其持有的資金,以及合約的一些重要方法,受其Owner控制
· 節(jié)點(diǎn)所持有的外部賬戶(hù):持有部分ETH,用于在提交完成請(qǐng)求的事務(wù)時(shí)支付交易費(fèi)用,可以在需要時(shí)將其賬戶(hù)持有資金提出。
來(lái)源: Chainlink資訊?





