📜 [專欄新文章] Tornado Cash 實例解析
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Tornado Cash 是一個使用 zk-SNARKs 建立的 Dapp,它實現了匿名的代幣交易,這篇文章就用一些程式碼片段,來分享它是怎麼運作的。
本文為 Tornado Cash 研究系列的 Part 3,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 1:Merkle Tree in JavaScript
Part 2:ZKP 與智能合約的開發入門
Special thanks to C.C. Liang for review and enlightenment.
我們知道在以太坊上的交易紀錄都是公開的,你可以在 etherscan 上看到某個地址的所有歷史交易紀錄,當然地址是合約的話也是一樣。
也許創建一個新的錢包和地址就好了?假設一個情境是 Alice 想要匿名傳送 1 ETH 給 Bob,Alice 原本的錢包是 A,但她不想讓 A 地址傳給 Bob 的交易紀錄被看到,所以 Alice 創建另一個錢包 B,顯然 B 錢包是空的,Alice 必須把 A 錢包的 1 ETH 傳到 B 錢包,再用 B 錢包的地址傳給 Bob。
但問題就在於,只要追蹤 B 錢包的地址,就能看到 B 的歷史交易紀錄中 A 錢包曾經打幣給 B 錢包,於是到頭來交易還是被追蹤到了。
Tornado Cash 的解決方案,簡單來說,它是一份合約,當你要匿名傳送代幣時,就把一定數量的幣丟進合約裡 (Deposit),此時你會拿到一個 note,長得像這樣:
tornado-eth-0.1-5-0x3863c2e16abc85d72b64d78c68fca5936db2501832e26345226efdfb2bc45804977f167d86b711bb6b4095ddaa646ec93f0a93ac4884a66c1d881f4fc985
note 就是一串字串,擁有這字串的人,就能提領 (Withdraw) 剛剛傳入合約的代幣。握有 note 就代表擁有提款的權利,所以 note 一旦被別人知道,別人就可以把錢給提走。
其中,後面那段亂碼,本篇文章就以「秘密」來稱呼,這個秘密是由 secret 與 nullifier 組成,而這兩個都是在鏈下隨機產生的亂數。
因此 Tornado 的合約基本上會有兩個函式:
Deposit
Withdraw
有興趣的人可以先到 Dapp 上先玩一次看看,使用 Goerli 測試網,這裡可以領 Goerli 的代幣:https://goerli-faucet.slock.it/
Deposit
我們就從 Deposit 開始說起,簡單來說, Deposit 是將資料儲存到合約的 Merkle Tree 上。
剛剛提到的秘密,它是在鏈下產生,由 secret 跟 nullifier 組成,合在一起之後也稱作 preimage,因為我們要對這個 preimage 進行 hash,就會成為 commitment。
合約中 Deposit 如下:
deposit 除了傳送代幣到合約之外,需填入一個參數 _commitment。
我們對 preimage 使用 Pedersen 作為 hash function 加密後產生 commitment,以偽代碼表示如下:
const preimage = secret + nullifier;const commitment = pedersenHash(preimage);
這個 commitment 會成為 Merkle Tree 的葉子,所以合約中的 _insert(commitment) 來自 MerkleTreeWithHistory.sol 的合約,將我們的資料插入 Merkle Tree,然後回傳一個 index 給你,告訴你這個 commitment 在 Merkle Tree 上的位置,最後一起發布成公開的 Deposit 事件。
我們知道 MerkleTree 是將一大筆資料兩兩做雜湊後產生一個唯一值 root,這個 root 就是合約上所儲存的歷史資料。
root 的特性就是只要底下的資料一有更動,就會重新產生新的 root。
所以只要一有用戶 deposit ,就會插入新的葉子到 Merkle Tree 上,於是就會產生新的 root,所以在合約中有一個陣列是用來儲存所有的 root 的 roots:
bytes32[ROOT_HISTORY_SIZE] public roots;
roots 是用來紀錄每個 deposit 的歷史,每一次 deposit 都會創造新的 root,而所有 root 都會被儲存進 roots 裡,於是當你要提領的時候,就要證明你的 commitment 所算出的 root 曾經出現在 roots 裡,代表曾經有 deposit 的動作,因此才可以進行提領。
Withdraw
在 Deposit 之前 Tornado Cash 就會在鏈下產生秘密後交給使用者,擁有這個秘密的人等於擁有提款的權利。
提領的時候,秘密會在鏈下計算後產生 proof,proof 是 withdraw 需要的參數,所以只要確保這個 proof 能夠被驗證,那麼代幣的接收地址 (recipient) 就可以隨便我們填,只要不填上當初拿來 deposit 用的地址,基本上就做到匿名交易的效果了。
也就是說,產生這個 proof 並提交給合約,能夠證明此人知道秘密,但卻不告訴合約秘密本身是什麼。
function withdraw(bytes calldata _proof, bytes32 _root, bytes32 _nullifierHash, address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund) external payable nonReentrant;
我們可以清楚看到 withdraw 函式裡沒有接收有關秘密的任何資訊作為參數,也就是秘密不會與合約有所接觸,也不會暴露在 etherscan 上。
回顧 ZKP 所帶來的效果:
鏈下計算
隱藏秘密
在 Tornado Cash 的例子中,我們用秘密來產生證明,完成的鏈下計算包括:
將秘密 hash 成 commitment
算出 Merkle Tree 的 root。
以下是簡化後的 withdraw.circom:
template Withdraw(levels) { signal input root; signal input nullifierHash;
signal private input nullifier; signal private input secret; signal private input pathElements[levels]; signal private input pathIndices[levels];
component hasher = CommitmentHasher(); // Pedersen hasher.nullifier <== nullifier; hasher.secret <== secret; hasher.nullifierHash === nullifierHash;
component tree = MerkleTreeChecker(levels); // MiMC tree.leaf <== hasher.commitment; tree.root <== root; for (var i = 0; i < levels; i++) { tree.pathElements[i] <== pathElements[i]; tree.pathIndices[i] <== pathIndices[i]; }}
component main = Withdraw(20);
從上述代碼就可以看出這份 circuit 的 private 變數有:
secret
nullifier
pathElements
pathIndices
而 public 變數有:
root
nullifierHash
如同我們一開始說過的,秘密就是指 secret 與 nullifier。這裡進行的鏈下計算就是對 secret 與 nullifier 雜湊成 commitment。而使用的 hash function 叫做 Pedersen。
在進行 Merkle Tree 的計算之前,我們還檢查了 nullifier 雜湊後的 nullifierHash 跟 public 變數 nullifierHash 是不是一樣的。
hasher.nullifierHash === nullifierHash;
接下來,開始計算 Merkle Proof,用意是確認經過雜湊後的 commitment 有沒有出現在 Merkle Tree 上,所以我們的 private input 還有 pathElements 與 pathIndices(詳情參考 Part 1 Merkle Tree in JavaScript),讓它跑一趟 Merkle Proof 的計算,最後就能夠算出一個 root,再確認計算後的 root 與我們的 public 變數 root 是否一樣。
tree.root <== root;
於是我們就能產生一個 ZKP 的證明 — 證明 private 變數:secret, nullifier, pathElements, pathIndices 可以計算出 public 變數:root 與 nullifierHash。
把這個證明提交給合約,合約透過 Verifier 驗證 proof 是否正確,以及必須事先確認:
public 變數 root 有在合約的 roots 裡面。
public 變數 nullifierHash 在合約中是第一次出現。
以下附上完整的 withdraw 原始碼:
必須注意 ZKP 是向合約證明使用者填入的 secret 和 nullifier 可以計算出某個 root,但無法保證這個 root 曾經在合約的 roots 歷史上。
所以合約的 withdraw 中,除了 verifyProof 之外,還要事先檢查 ZKP 算出來的 root 是不是真的在歷史上發生過,所以需要 isKnownRoot 的檢查:
function isKnownRoot(bytes32 _root) public view returns(bool)
必須先檢查 isKnownRoot 後才能進行 verifyProof。
經過 verifyProof 驗證成功後,合約就開始進行提款的動作,也就會將代幣傳到 recipient 的地址,最後拋出 Withdrawal 的事件。
nullifier 與 nullifierHash
為什麼我們的秘密不是只有 secret 還要額外加一個 nullifier?
簡單來說,這是為了防止已經提領過的 note 又再提領一次,也就是所謂的 double spend。
require(!nullifierHashes[_nullifierHash], "The note has been already spent");
可以看到 withdraw 需要填入參數 nullifierHash,跟 isKnownRoot 一樣的狀況,我們需要對電路的 public 變數先經過一層檢查之後,才能帶入到 verifyProof 裡面。
nullifierHash 可以理解為這個 note 的 id,但它不會連結到 deposit,因此可以用來紀錄這個 note 是否已經被提領過。
所以當 verifyProof 驗證成功之後,我們要紀錄 nullifierHash 已完成提領:
nullifierHashes[_nullifierHash] = true;
有關為什麼需要事先檢查 public 變數後,才能帶入 verifyProof ,可以參考 Part 2:ZKP 與智能合約的開發入門 提到的 publicSignals 的部分。
附上 Tornado Cash 的架構圖:
簡化版的 tornado-core
tornado-core 的程式碼很簡潔漂亮,所以我模仿該專案自己實作一遍:
simple-tornado:https://github.com/chnejohnson/simple-tornado
這份專案只完成了 tornado-core 的核心部分,不一樣的是我的開發環境使用 hardhat 與 ethers 寫成,而 circom 與 snarkjs 使用官方當前的版本,合約用 0.7.0,測試使用 Typescript 。
比起兩年前的 tornado-core ,simple-tornado 使用的技術更新,可能更適合初學者理解這份專案,但是它有 bug…我在 issues 的地方有紀錄說明。
在開發的過程中,我的順序是先從最小單位的 MiMC hash function 開始玩,發現必須 javascript 算一次 hash、solidity 算一次、circom 再算一次,確保這三個語言對同一個值算出同樣的 hash 之後,才能放心去做更複雜的 Merkle Tree。
總結
我們可以看到 Tornado Cash 簡單的兩個函式:Deposit 與 Withdraw,透過將代幣送入合約後再提領到另一個地址的流程,應用 ZKP 達成匿名的交易。
除了斷開 Deposit 與 Withdraw 的地址關聯性之外,Tornado Cash 還有做了一層「藏樹於林」的隱私防護,這部份的解釋就請參考 ZKP 讀書會 Tornado Cash。
網路上很多關於 ZKP 的文章或專案都是在 2019 年後出產的,經過許多人對這項技術的嘗試,讓我們對 ZKP 有了更清晰的理解,如今兩年後,開發工具也變得更加成熟,期待未來在 web 隱私議題上能看到更多 ZKP 大放異彩的應用。
原始碼
tornado-core
simple-tornado
參考資料
ZKP 讀書會 Tornado Cash
Tornado Privacy Solution Cryptographic Review
Tornado Cash 實例解析 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有190部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,Android_Studio開發網路資料庫(第9次網路下載資料複習與SQLite資料庫說明&實作SQLite與建立資料庫與資料表與新增與查詢資料&CursorAdapter&SQL語法UPDATE與DELETE&用DDMS抓取SQLite與查詢&範例SQLite2水果查詢&成語查詢系統&會員查詢系統...
「網路 架構圖 說明」的推薦目錄:
網路 架構圖 說明 在 Facebook 的最讚貼文
所謂監督,要避免主觀臆測,如果先入為主代入不尋常的觀念,並臆測為監督對象的想法,我想這不叫監督,叫做妖魔化,不但無助於政府做出實際改變,反而淪為莫須有的指控,更慘的是,所操的論據不明,反而應著親中勢力的論調行走.
.
所謂究責,要本於事實,如果是去脈絡化的,只會誤導民眾,某某黑手,某某暗黑勢力,某某高層認為,這些都不是基於事實,而流於陰謀論,有股看不見的暗黑力量在背後操作-這是最廉價的批判方式,我們不會把事實不明確的東西當作要對方負起責任的根據,這不叫究責,叫鬥爭.
.
時代力量這些「把國際疫苗推出國門外的疫苗政策」的究責,基本上都直接忽略了中國介入的因素,而部分的觀點更是錯得離譜,請恕神父在此指正.
.
這些事情至少包括,
.
東洋聲稱採購疫苗數量為3千萬劑,根本是單方面誇大的說詞,衛福部方面說得很清楚,與東洋談判時,就是買200萬劑.
.
所以不是3千變200,或是中途變卦,這種說法並不符合事實,更何況,東洋聲稱採購這麼龐大的數量,卻連一點基本文件都拿不出,甚至有炒股之嫌,若以第三勢力的立場,應該是懷疑東洋所謂的疫苗採購計畫,這些都是人民的稅金,如果對方來路不明,衛福部還硬要答允,這才是失職,若對方拿不出BNT直接授權書和合約草約,政府還答應簽下去,按照時力過往的風格不是應該質疑是否有圖利嗎?怎麼會變成要買3000萬疫苗,結果變200萬,責任在政府方?暗示政府買不到,不夠努力去買?這種說法和統媒幾天前操作的「東洋BNT簽下去就少死400」有何不同?如果對方有沒有原廠背書不知道,來源不透明,那先買200萬,確定對方是否能供貨,不才是分散風險的做法?
.
更慘的是「台灣東洋也是在最後才說需要BNT亞洲代理商上海復星醫藥三方授權.」
.
請問時力遇到這種約會簽下去?
.
至於雅各臣與上海復星及附屬子公司復星實業香港公司簽約擁有代理權,衛福部擔心有圖利他人之嫌,最後查明有中資背景,所以加以否決掉了.
.
這些都是上海復星想介入台灣疫苗採購的案例,也凸顯了所謂民間採購的風險和不可靠性,上海復星非法取得了台灣的代理權再說要轉讓他,天底下有這麼免錢又不賠本的生意?
.
最後,上海復星和中國還阻饒了我們和德國原廠買疫苗.
.
請問這是「把國際疫苗推出國門外去」嗎?時代力量想要帶入國門的是這種充滿統戰影子的空氣疫苗嗎?
.
好,今天我說要賣時代力量2千萬顆救命仙丹好了,你不買可否說是拒絕「國際仙丹於時力大門之外」?你說先買10顆看看好了,我說,不行,要買2千萬顆,這樣我是不是能說,「時代力量錯失時機,不顧黨員死活」?我想聰明如你應該發現了,這種說法成立,第一,那仙丹是真的,第二,我真的有2千萬顆.
.
再來,AZ授權代工問題,「若台康接下國外疫苗生產任務,將影響國內產能」這不是市場傳出的,也不是黑手,這是有名有姓的人物,詳見於以下報導:
.
「國光生技總經理留忠正接受《報導者》採訪表示....
.
國光已和台大醫院簽署臨床試驗合作計畫,由台大副校長張上淳領銜計畫主持。然而,行政院打算採取國外授權、由台康代工生產的模式,讓國光的布局起了變化──因為台康是蛋白質藥廠,也替本土疫苗廠代工疫苗原液。
.
留忠正表示,先前的確已和台康接觸生產疫苗,『但若台康接下國外疫苗生產任務,將影響國內產能』,國光可能也要找其他家業者合作.直接向國外採購疫苗成品比較單純,做代工會影響到本土生產線,『政府太急了,可以再等1、2個月,若我們臨床試驗情況不好再和國外談.』」
.
https://www.twreporter.org/a/covid-19-taiwan-vaccine-development
.
這是2020年8月的報導,「疫苗新布局:爭取牛津授權、台廠代工有望,國家隊產能為何恐受影響?」,副標題是「政府急搶牛津授權代工,本土廠商憂排擠生產量能」,當時政府的態度是極力爭取的,甚至還被批評,「太急了」,怎麼會變成是什麼黑手介入阻擋代工呢?
.
最後,我不曉得「政府高層卻有另一股聲音,認為疫情只需採購少量國際疫苗供醫護防疫人員使用,其餘民眾仰賴國產疫苗即可」這是怎麼來的,要提出這種指控煩請提出根據,民眾現在有在仰賴國產疫苗嗎?至少現在打入民眾身體裡的,無論是疫情之前,還是現在,或是往後美國送的250萬劑莫德納,全部都是國際疫苗吧?
.
台灣採購的國際疫苗是少量嗎?買國外的疫苗約2000萬劑,國產疫苗1000萬劑,怎麼看,都不像是「集中押注國產疫苗」,更不會是「只需採購少量國際疫苗」,至於下訂高端、聯亞各500萬劑,坦白說,這已經是最廉價的支持方式.
.
如果端看日本、韓國,都在對他們的國產疫苗下重本,韓國人民批評政府太慢發展國產疫苗,日本人批評研發國產的疫苗速度太慢,就台灣有人卻稱「集中押注國產疫苗,導致風險集中,並不是一個好的疫苗取得策略.」,這種想法顯然與世界脫節,日本補助4間疫苗開發商至少122億台幣,而他們還沒有一家進入三期,而有趣的是,韓國的Genexine疫苗,2期還沒完成,就已經有印尼的製藥廠採購1000萬劑了,同樣的例子,還有以色列.
.
所以,無論是「政府只押寶國產」、「政府要民眾只仰賴國產」,這些其實都跟「蔡英文炒股國產」的說法來源差不多,都是針對國產的不合理的打壓和過度懷疑,而這個想法的根源,源自於一種對於復屁太的渴望,他們稱那是上海復星代理的德國原廠BNT,從復屁太是唯一轉變成台灣必須買透過上海復星代理的疫苗,而忽視其「台灣被代理」、「台灣只能買中國代理的疫苗」、「拋售自己的代理權」的危險性,在盤算台灣得不到國際疫苗,國際疫苗供貨欠缺,任何國家包括歐盟都拿不到足夠疫苗的窘境,藉由打壓國產,使台灣民眾對其產生不信任,得到了所謂「國際疫苗」,也就是中國和中國代理的疫苗,封死所有路徑,要台灣只能往被中國綁架和被敵國扼其生命線予取予求的結果行走.
.
如今,美國送來了遙遠的禮物,破除了這種迷信,250萬劑莫德納,在政府的努力下,蕭美琴在機場上站立了6小時,才讓這一批疫苗得以到台灣.
.
然後,真正的德國BNT,在駐德大使的話語中,也透露出和原廠洽談的曙光.
.
時代力量的立委在臉書上感謝美國,別忘了美國提醒的一件重要的事,
.
「對美方而言,更驚訝的是,台灣的在野陣營與中共,似乎正在營造全球疫苗只剩下BNT或科興兩種疫苗,而BNT還一定要中國公司代理.」
.
「美方也明確反映,看到台灣有立委喊出要『槍斃衛生部長(國民黨立委費鴻泰嗆聲要槍斃衛福部長陳時中)』,還有民眾在網路鼓動沒疫苗要起義,覺得相當不可思議.」
.
時代力量作為第二個在野黨,更應該搞清楚狀況,而不是跟隨民粹起舞,這些你認為應該「究責」的事,恰巧說明了,你正站在那些營造「全球只剩下BNT或科興,還必須由中國代理」的那一方.
.
至於什麼請政府全力協助永齡,這實在好笑,台積電就算了,他們擁有晶片換疫苗的實力,請問郭台銘有什麼東西?他到目前為止能買到疫苗的根據,就只有其妻「他每天做夢說夢話都在說疫苗」這一項而已,依據郭台銘過往被情感詐騙還有說大話的經歷,無論是參選總統參選到一半退出,還是什麼富士康到美國設廠,時代力量自詡為勞權政黨,更應該懷疑這個富豪說話的可信度,當郭台銘向總統提出要求「同意我方提出的捐贈合約,進入實質細節的討論,也同意我方對於採購德國BNT(上海復星製藥代理),由德國製造出貨的疫苗,所提出的合約架構圖,並給予相應於合約的進口許可相關法律文件.」這根本與他一開始說的不符,而顯然又是另一個東洋與雅各臣的重蹈覆轍.
.
作為時代力量的立委,你應該去質疑郭台銘這個資方代表到底說的是不是空氣疫苗.
.
韓國大邱的殷鑑不遠,南韓大邱市長權泳臻(권영진在野黨國民力量)透過德國一間貿易公司,向德國BNT購買疫苗,也是號稱買了3千萬劑,結果購買的疫苗來源不明,韓國人紛紛跳出來大喊「市長被騙了!」他們質疑,在世界疫苗供應緊張的情況下,大邱市究竟有何能力,可以在短期內確保6000萬劑的疫苗?大邱市長企圖繞過中央,逃避政府的審核,結果要買的疫苗每瓶的成分量和接種量資料,都與實際的輝瑞疫苗不同,所謂貿易公司住址在佛羅里達,電話號碼在葡萄牙,網頁顯示修正中,顯示這是一場疫苗詐欺.
.
套一句其他韓國議員的評論,
.
「疫苗不是海外直購或代購的走私品,是得依據國家簽約輸入、要接種得經過食藥處承認的醫藥品…大邱現在是全國疫苗接種率及預約率最低的地方,別為了不可能買到的疫苗而奔波,顧好現有的疫苗,先把拯救大邱市民生命與協助恢復日常生活等事情做好吧.」
.
另一個無黨籍市議員開炮,「這是損害國庫的大事!」
.
而郭台銘買疫苗此事升起的政治效應,一開始就是要繞過政府,不准指揮中心審核,指揮中心有任何正常程序,全都被說是在卡疫苗,「政府買不到,不讓民間買」.
.
在神父看來,這一連串的政治效應,都像是大邱事件的警示.
.
「大邱有批很讚的疫苗」,就和去年乃至於今年或是現在的離奇事件,人們異常的心態有關,果凍有批很讚的疫苗,比國產的還好,上海復星有批很讚的疫苗,政府不顧人民死活,為了一批空氣疫苗,詆毀現有的種種,已經買的國際疫苗,正在施打的當做不存在,將來副作用較低,能緩解疫苗荒的國產,被黑到不成人形,這才是台灣在疫苗採購上,陷入左支右絀的原因.
.
人人都說不能輸韓國,凡事都跟韓國比,而韓國人卻知道,越在逆境之中越要保持清醒,不隨著外力,對政府進行不合理的施壓,然後只為了去鼓吹偏方與不合理的管道.
.
或者只是為了滿足一再大喊「有人卡我!」這樣的政治操作.
.
「民間來簽約採購,政府提供必要協助」,乃或是授權民間來代表政府,這些都是具有高度風險的事情,也不是正常的方法,前面的佛光山、乃或是張亞中憑著一張國台辦的聲明,都是十分明顯負面的示範,而今開了門,也是有條件的,相關的法律豁免權只給原廠,進來台灣的疫苗依然必須取得原廠證明.
.
時代力量應該做的,不是鼓吹這種方式,而是監督可能弊端,我國政府與原廠簽約的原則,尚在進行著,並持續與德國洽談,到時,誰在吹法螺,誰是真材實料,一目了然.
.
而今的在野黨,無論是國民黨或者台民黨,已經失去監督的功能,只剩下作亂、造假,以及鬥爭,時代力量作為一開始以本土力量自詡的政黨,更應該在部分政黨走向極端甚至失能,鼓吹與指揮中心作對,搞BNT起義,販售台灣代理權的時候,指引迷茫的群眾正確的道路.
.
如要隨波逐流,乃或是同流合汙,一面美國好棒,一面要究責避開上海復星代理陷阱的指揮中心,要指揮中心同意這些莫名其妙的採購,才不是一件離奇的事,又把民間採購這種偏方當解方,對於國產疫苗又採取不合理的偏見.
.
這樣的時代力量,恕神父難以苟同,BROTHER.
網路 架構圖 說明 在 軟體開發學習資訊分享 Facebook 的最讚貼文
今天的開源報報( 每週一到週五 早上 7:00 準時發刊 )
✅ 使用 Rust 從頭開始開發一個 DNS 伺服器教學
✅ 無須與 Google 服務整合的 Chromium 瀏覽器
✅ 偵測資料庫管理系統( DBMS )中的邏輯臭蟲
✅ 一個人性化和快速的 cut 和 awk 替代工具
✅ 使用 Go 建構的書籤管理工具
✅ IDA 和 VS Code 的整合,可以輕鬆地執行和除錯 IDAPython Scripts
✅ 使用簡單的 YAML 語法並利用 GraphViz 生成高階微服務架構圖
✅ SpringBoot 相關漏洞學習資料,利用方法和技巧合集,黑盒安全評估檢查列表
✅ Vue 表單建構器
✅ 定量金融分析的程式庫、軟體套件資源列表
✅ 一個針對網路使用者的 Linux 函式追蹤程式
✅ 使用 C# SDL 和 OpenGL 編寫的紅色警戒開放原始碼遊戲
https://softnshare.com/opensource-news-142/
網路 架構圖 說明 在 吳老師教學部落格 Youtube 的最讚貼文
Android_Studio開發網路資料庫(第9次網路下載資料複習與SQLite資料庫說明&實作SQLite與建立資料庫與資料表與新增與查詢資料&CursorAdapter&SQL語法UPDATE與DELETE&用DDMS抓取SQLite與查詢&範例SQLite2水果查詢&成語查詢系統&會員查詢系統)
上課內容:
01_網路下載資料複習與SQLite資料庫說明
02_實作SQLite與建立資料庫與資料表與新增與查詢資料
03_SQLite查詢與CursorAdapter建立說明
04_增加SQL語法UPDATE與DELETE功能
05_抓取SQLite檔案與開啟
06_用DDMS抓取SQLite與查詢方式說明
07_範例SQLite2水果查詢範例說明
08_如何修改為成語查詢系統
09_如何修改為會員查詢系統
10_修改為顯示會員詳細資料
完整影音
https://www.youtube.com/playlist?list=PLCfL1sBZ2_SQ91f7mCX9w5fmAx_gnlQCC
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/forum/#!forum/java_object2016
懶人包:http://terry55wu.blogspot.com/p/android.html
想學好Android開發,
先學會Android_Studio開發環境建置,
或是直些下載我的Android_Studio穩定開發版,
只要再裝好JAVA SDK(32位元)版即可,
不要浪費時間再當白老鼠,這也是很多人的痛。
接下來就是建個 HelloWorld 接下來就是把自己的創意變成APP,
開始努力建置APP,為台灣的軟體產業加把勁,
展現台灣的軟實力吧!
Android_Studio穩定開發版 [下載]
JAVA SDK(32位元) [下載]
課程理念與課程介紹:
Android智慧型手機平台,已成為手機上最完整的開放開發平台
人手必備的趨勢下行動上網已達500萬人次以上,手機相關應用,將會超越PC,比PC更智慧,更貼近個人使用習慣,未來APP將漸取代Web,成為各產業或政府對外窗口。
如何開發APP,以循序漸進的方式講授Android應用程式架構、圖形介面開發、測試與除錯等,進而取得證照。
吳老師教學特色:
1.影音複習分享(全程錄影)。
2.能不硬code程式,有程式也會提供畫面。
3.提供業界實務開發經驗。
4.書上沒講到的操作,圖形化工具使用。
5.隨時更新第一手資訊。
參考書目
Android 初學特訓班
作者:鄧文淵/總監製;文淵閣工作室/編著
出版社:碁峰 出版日期:2011年12月29日 2刷
Java SE 7與Android 4.x程式設計範例教本
作者:陳會安
出版社:碁峰
出版日期:2011年12月29日
吳老師教學部落格:
http://terry55wu.blogspot.com/
吳老師
android 開發教學,android 程式教學,android 使用教學,android app教學,android sdk,android eclipse,android 開發,android studio 開發教學,android studio tutorial,android studio download,android app開發資料庫,app開發資料庫,網路資料庫教學,app開發教學
網路 架構圖 說明 在 吳老師教學部落格 Youtube 的最讚貼文
Android_Studio開發網路資料庫(第9次網路下載資料複習與SQLite資料庫說明&實作SQLite與建立資料庫與資料表與新增與查詢資料&CursorAdapter&SQL語法UPDATE與DELETE&用DDMS抓取SQLite與查詢&範例SQLite2水果查詢&成語查詢系統&會員查詢系統)
上課內容:
01_網路下載資料複習與SQLite資料庫說明
02_實作SQLite與建立資料庫與資料表與新增與查詢資料
03_SQLite查詢與CursorAdapter建立說明
04_增加SQL語法UPDATE與DELETE功能
05_抓取SQLite檔案與開啟
06_用DDMS抓取SQLite與查詢方式說明
07_範例SQLite2水果查詢範例說明
08_如何修改為成語查詢系統
09_如何修改為會員查詢系統
10_修改為顯示會員詳細資料
完整影音
https://www.youtube.com/playlist?list=PLCfL1sBZ2_SQ91f7mCX9w5fmAx_gnlQCC
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/forum/#!forum/java_object2016
懶人包:http://terry55wu.blogspot.com/p/android.html
想學好Android開發,
先學會Android_Studio開發環境建置,
或是直些下載我的Android_Studio穩定開發版,
只要再裝好JAVA SDK(32位元)版即可,
不要浪費時間再當白老鼠,這也是很多人的痛。
接下來就是建個 HelloWorld 接下來就是把自己的創意變成APP,
開始努力建置APP,為台灣的軟體產業加把勁,
展現台灣的軟實力吧!
Android_Studio穩定開發版 [下載]
JAVA SDK(32位元) [下載]
課程理念與課程介紹:
Android智慧型手機平台,已成為手機上最完整的開放開發平台
人手必備的趨勢下行動上網已達500萬人次以上,手機相關應用,將會超越PC,比PC更智慧,更貼近個人使用習慣,未來APP將漸取代Web,成為各產業或政府對外窗口。
如何開發APP,以循序漸進的方式講授Android應用程式架構、圖形介面開發、測試與除錯等,進而取得證照。
吳老師教學特色:
1.影音複習分享(全程錄影)。
2.能不硬code程式,有程式也會提供畫面。
3.提供業界實務開發經驗。
4.書上沒講到的操作,圖形化工具使用。
5.隨時更新第一手資訊。
參考書目
Android 初學特訓班
作者:鄧文淵/總監製;文淵閣工作室/編著
出版社:碁峰 出版日期:2011年12月29日 2刷
Java SE 7與Android 4.x程式設計範例教本
作者:陳會安
出版社:碁峰
出版日期:2011年12月29日
吳老師教學部落格:
http://terry55wu.blogspot.com/
吳老師
android 開發教學,android 程式教學,android 使用教學,android app教學,android sdk,android eclipse,android 開發,android studio 開發教學,android studio tutorial,android studio download,android app開發資料庫,app開發資料庫,網路資料庫教學,app開發教學
網路 架構圖 說明 在 吳老師教學部落格 Youtube 的最佳貼文
Android_Studio開發網路資料庫(第9次網路下載資料複習與SQLite資料庫說明&實作SQLite與建立資料庫與資料表與新增與查詢資料&CursorAdapter&SQL語法UPDATE與DELETE&用DDMS抓取SQLite與查詢&範例SQLite2水果查詢&成語查詢系統&會員查詢系統)
上課內容:
01_網路下載資料複習與SQLite資料庫說明
02_實作SQLite與建立資料庫與資料表與新增與查詢資料
03_SQLite查詢與CursorAdapter建立說明
04_增加SQL語法UPDATE與DELETE功能
05_抓取SQLite檔案與開啟
06_用DDMS抓取SQLite與查詢方式說明
07_範例SQLite2水果查詢範例說明
08_如何修改為成語查詢系統
09_如何修改為會員查詢系統
10_修改為顯示會員詳細資料
完整影音
https://www.youtube.com/playlist?list=PLCfL1sBZ2_SQ91f7mCX9w5fmAx_gnlQCC
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/forum/#!forum/java_object2016
懶人包:http://terry55wu.blogspot.com/p/android.html
想學好Android開發,
先學會Android_Studio開發環境建置,
或是直些下載我的Android_Studio穩定開發版,
只要再裝好JAVA SDK(32位元)版即可,
不要浪費時間再當白老鼠,這也是很多人的痛。
接下來就是建個 HelloWorld 接下來就是把自己的創意變成APP,
開始努力建置APP,為台灣的軟體產業加把勁,
展現台灣的軟實力吧!
Android_Studio穩定開發版 [下載]
JAVA SDK(32位元) [下載]
課程理念與課程介紹:
Android智慧型手機平台,已成為手機上最完整的開放開發平台
人手必備的趨勢下行動上網已達500萬人次以上,手機相關應用,將會超越PC,比PC更智慧,更貼近個人使用習慣,未來APP將漸取代Web,成為各產業或政府對外窗口。
如何開發APP,以循序漸進的方式講授Android應用程式架構、圖形介面開發、測試與除錯等,進而取得證照。
吳老師教學特色:
1.影音複習分享(全程錄影)。
2.能不硬code程式,有程式也會提供畫面。
3.提供業界實務開發經驗。
4.書上沒講到的操作,圖形化工具使用。
5.隨時更新第一手資訊。
參考書目
Android 初學特訓班
作者:鄧文淵/總監製;文淵閣工作室/編著
出版社:碁峰 出版日期:2011年12月29日 2刷
Java SE 7與Android 4.x程式設計範例教本
作者:陳會安
出版社:碁峰
出版日期:2011年12月29日
吳老師教學部落格:
http://terry55wu.blogspot.com/
吳老師
android 開發教學,android 程式教學,android 使用教學,android app教學,android sdk,android eclipse,android 開發,android studio 開發教學,android studio tutorial,android studio download,android app開發資料庫,app開發資料庫,網路資料庫教學,app開發教學
網路 架構圖 說明 在 CCNA 網路實務教學: 16 網路架構規劃 - YouTube 的必吃
教學資源下載: https://bit.ly/2WAPVxH 要考CCNA 請加入蕭老師CCNA 考試討論群https://bit.ly/35DTgAM 新版 網路 培訓班開課資訊, 對 網路 管理有興趣者, ... ... <看更多>