contributed by < steven1lung >
EIP 全名 Ethereum Improvement Proposals,這個專案是為了將 ethereum 的標準合約都集中起來說明,讓使用 ethereum 的客戶或是應用程式可以更輕鬆使用。
EIP20 就是一個標準的加密貨幣介面,可以允許一些智能合約透過 API 溝通。這個合約提供了基本貨幣功能,像是轉帳或是允許貨幣經過認證被使用在其他的鏈上的第三方程式。
name
這個變數就是加密貨幣的名稱,像是 Ethereum
symbol
這個變數就是加密貨幣的簡稱,像是 ETH
decimals
這個變數是加密貨幣的精準度,到時候設定貨幣發行數量時也要考慮到精準度。
function EIP20(
uint256 _initialAmount,
string _tokenName,
uint8 _decimalUnits,
string _tokenSymbol
) public {
balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
totalSupply = _initialAmount; // Update total supply
name = _tokenName; // Set the name for display purposes
decimals = _decimalUnits; // Amount of decimals for display purposes
symbol = _tokenSymbol; // Set the symbol for display purposes
}
看到建構子將我們所給予的名稱、代號、精準度的參數就將值設定好了。
transfer
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balances[msg.sender] >= _value);
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
這就是當你購買加密貨幣時,會使用這個函式將貨幣轉到你的錢包地址裡。一開始先檢查貨幣地址的剩餘數量夠不夠,再將雙方的餘額數量設定好,就可以呼叫 Transfer()
將貨幣轉給購買者。
transferFrom
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
uint256 allowance = allowed[_from][msg.sender];
require(balances[_from] >= _value && allowance >= _value);
balances[_to] += _value;
balances[_from] -= _value;
if (allowance < MAX_UINT256) {
allowed[_from][msg.sender] -= _value;
}
emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
這個函式就是在你要跟其他人交易貨幣時所使用的,像是其他人向你購買貨幣,就可以使用這個 transferFrom
函式。可以看到這個函式比上面的 transfer
多了一個 address _from
參數,表示要從這個 _from
的位址轉移貨幣給 _to
,其他運作都跟上面一樣。
balanceOf
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
這個函式就是回傳一個位址所擁有的貨幣數量,非常直覺。
approve
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
這個函式會允許某個錢包位址花費 _value
個貨幣,首先會設定好位址可以花費的數量,再呼叫 Approval()
。
allowance
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
這個函式會回傳剛剛再 approve
所設定位址允許花費的貨幣數量。
contributed by < steven1lung > Documentation 在 Linux 核心中,有許多地方都有使用到紅黑樹。但是我們可能會想說為什麼要使用紅黑樹,而不是其他的二元樹像是:AVL Tree 之類。雖然二者平均時間複雜度都是 $O(\log n)$,但因行為和特性的落差,有不同的應用場景。 以下簡述 AVL Tree 和紅黑樹的差異: 平衡AVL Tree 比紅黑樹還要平衡(左右子樹的高度不能差超過 2),但是會在平衡自己的時候花費比紅黑樹多的時間。 如果考慮到要更快速地去 search 一個節點,那 AVL tree 會比較適合。
Jul 28, 2023contributed by <steven1lung> and <Niomoo> Git 是所有開發者、工程師必定要學會如何使用的工具,今天就打算講解一下我們為什麼會需要版本控制工具,以及要如何去初步使用它。  課程投影片請點我。 介紹 Git 是由 Linux Kernel 的開發者 Linus Torvalds 在開發 kernel 時,因為需要一個版本控制工具而發明的。
Nov 18, 2022contributed by < steven1lung > 我自己的心得 在看老師的書 Demystifying the Linux CPU Scheduler 的時候,突然好奇說每一個任務的 loading 是如何運算的,畢竟排程器上的任務如此多,計算出 load 然後依據每個 CPU 的狀態去做 task migration 應該是很重要的課題。所以我就跑去 pelt.c 看了一下實際的運算是如何做到的。 pelt 全名是 Per Entity Load Tracking 在看程式碼的時候,發現有個地方的中括號打反了變成 [1002..1024[,我就想說試試看發人生第一個 patch。 結果自己在摸索如何發 patch 花了好多時間...,轉眼間就早上了。所以就記錄了一下自己發 patch 的過程來紀念逝去的時間。雖然這個 patch 最後是我誤會中括號的用法,所以並沒有被採納,但跟這些厲害的人交流讓人有點興奮><
Sep 29, 2022contributed by < steven1lung > :checkered_flag: 自我檢查清單 [x] 參照 Linux 核心模組掛載機制,解釋 $ sudo insmod khttpd.ko port=1999 這命令是如何讓 port=1999 傳遞到核心,作為核心模組初始化的參數呢? [ ] 參照 CS:APP 第 11 章,給定的 kHTTPd 和書中的 web 伺服器有哪些流程是一致?又有什麼是你認為 kHTTPd 可改進的部分? [ ] htstress.c 用到 epoll 系統呼叫,其作用為何?這樣的 HTTP 效能分析工具原理為何? [x] 給定的 kecho 已使用 CMWQ,請陳述其優勢和用法 [x] 核心文件 Concurrency Managed Workqueue (cmwq) 提到 "The original create_*workqueue() functions are deprecated and scheduled for removal",請參閱 Linux 核心的 git log (不要用 Google 搜尋!),揣摩 Linux 核心開發者的考量 [ ] 解釋 user-echo-server 運作原理,特別是 epoll 系統呼叫的使用
Jun 17, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up