開發者會議紀錄 DevMeeting 20180225

  • 支援ledger硬體錢包的程式碼距離可以被合併的進度又大幅的縮短了
    • 需要與ledger硬體錢包的團隊更進一步的討論才能收尾
  • 三月的硬分叉(協定的升級)
    • 正在等待vtnerd的PoW調整。CUDA跟CPU的部分已經上傳到Github了,而OpenCL還在測試中。
    • 在硬分叉前後一周的禮拜天都將舉行開發者會議,時間在17:00 UTC
  • 有關預設環狀簽數量的討論

繼續閱讀...

關於PoW共識機制更動與重複使用金鑰

PoW共識機制的更動

最近常常可以看到關於抵抗ASIC礦機和如何面對潛在的ASIC礦機威脅等話題,這篇文將會(稍微)認真地指出: 我們對於如何藉由在硬分叉時調整PoW共識機制以維持抗ASIC礦機特性的立場。

特殊應用積體電路(Application Specific Integrated Circuit)簡稱ASIC在這邊指得是被特殊設計出來的挖礦硬體,舉例來說,BTC的ASIC礦機被設計用來挖SHA256演算法的加密貨幣。由於這種硬體是被特別設計用來挖礦的,也因此會比CPU、GPU、甚至是FPGA等日常使用的硬體來得有大量的效能優勢。因此,任何被設計出來的ASIC將會顯著地主宰全網算力並導致中心化的問題。

Monero的程式碼是從CryptoNote參考實作分出(fork),在CryptoNote的白皮書(https://cryptonote.org/whitepaper.pdf)中提到,比特幣的一個最大的缺點即是其PoW共識機制導致了中心化的問題。為了打造更平等的挖礦網路和更去中心化的特性,原先的CryptoNote開發者創造了Cryptonight PoW共識機制,以此拉近CPU(大眾)與GPU/FPGA/ASIC(少數人)的挖礦能力差距。CryptoNote的作者亦提到了”有些礦工比其他礦工更有優勢是合理的”,因為”他們的投資應能線性的提升其算力優勢”,這代表ASIC礦機的出現或許是必然的。我們雖然也認同這樣的可能性,但為了去中心化的原則下,我們認為任何ASIC礦機算力優勢的出現必須要越平等越好。在發文此刻,我們認為任何新發展的ASIC礦機都不會是平等的算力,更不會使Monero網路趨向去中心化。

比特幣使用的PoW共識機制(SHA256)具有一個重大的缺點,就是太容易就能從CPU轉移至GPU、接著至FPGA、最後就發展到了ASIC,這其中每一個轉移都帶來了巨大的效率提升。因此CPU挖礦與ASIC挖礦之間就存在著巨大的效益差距,導致最後ASIC成為了唯一挖礦的可行方案,這在本質上造成了中心化,因為只有少數的製造商才有辦法生產ASIC礦機。Cryptonight (Monero的PoW機制)為了拉近CPU、GPU、FPGA、ASIC的差距,在PoW共識機制中綁定了一定數量的記憶體需求,這樣的方式造成了ASIC的製造成本顯著提升。這個PoW機制帶來了更平等的挖礦,這樣的好處有: 第一,如果挖礦算力是去中心化的,這將會防止礦工刻意去挑選或忽略特定交易的確認,避免Monero的區塊鏈審查行為。第二,這將會降低挖礦趨於中心化至大型挖礦廠房。第三,這將會讓政府難以管制可以用來挖礦的硬體。

進一步地說,特製的硬體幾乎只能由少數的公司設計,如同比特幣目前的情況,最大宗的ASIC礦機都是由Bitmain設計與生產。如Peter Todd所說: “世界上僅有非常少數的公司有能力創造出有競爭力的ASIC礦機,基本上就是Intel、ASMC、GlobalFoundries等等”。

這造成了一個單點失效(single point of failure)的弱點,例如,政府可能向ASIC製造商要求增加一個”自殺開關”,這樣使得其能從遠端關閉或是控制礦機,而這將是有潛力破壞整個交易網路的威脅。或是政府也可以要求礦工必須擁有執照才能使用ASIC挖礦,如此就限制了ASIC礦機只能被特定的團體所持有。這樣的證照系統最終可能導致某些交易的黑名單行為,譬如,政府可以要求礦工不得打包特定的交易否則就撤銷證照。相反的,用日常用途的硬體挖礦就可以讓這些手段無法被實際執行。

挖礦這件事,通常來說也具有著讓富者恆富的效應,最終導致中心化的問題。譬如具有經濟規模的礦工可能會更有足夠資本來提升其在全網算力裡的占比。而Cryptonight演算法,拜其平等的特性所賜,或多或少迴避了這個問題,因為礦工必須面對數種來源的競爭: (i) 幾乎沒有成本的殭屍網路(botnet)、(ii) 愛好者礦工,並非由利益驅動的使用他們的CPU與GPU支持網路、(iii)網頁礦工,這種有可能是非法(未經同意透過廣告挖礦)也有可能是合法(用來代替CAPTCHAs或減少/替代廣告)的方式。相對之下,ASIC礦機加速了富者恆富,因為他們沒有上述提及的競爭對手。

總結來說,我們強烈的相信保持抵抗ASIC的特性將會帶來好處,因此若有需要時,我們可能會發起臨時性的硬分叉以約束任何潛在的ASIC礦機威脅。此外,為了維持去中心化的目標並抑制檯面下的ASIC開發,Monero核心開發團隊將會在每次的例行分叉更新時微調PoW共識機制,也就是一年兩次的周期,這些更動將會是細微的調整,且不會影響效能太多,第一次微調已在測試中,將在本次三月的硬分叉中實施。我們的最終目標則是研發出新的一套PoW共識機制演算法以取代Cryptonight來確保更好的ASIC抵抗能力。

微調將會相容於下列軟體: zone117x’s pool, Snipa’s pool, Lucas Jones’ CPU miner, wolf0’s CPU miner, ccminer-cryptonight, sgminer-gm, xmr-stak, xmrig-nvidia, wolf-xmr-miner。

金鑰的重複使用

身為使用者的你必須意識到Monero網路與你所擁有的Monero安全性是取決於你握有的Monero私鑰,你的Monero金鑰就是Monero金鑰。請不要把他們拿來使用在其他用途,包括在Monero的其他分叉幣上取得錢幣。若你使用同一份金鑰(key)在不同鏈上重複花費同一筆交易輸出(output),這將會傷害你的隱私,同時也對其他人的隱私造成傷害,因為這會產生相同的金鑰映像(key image)在不同的環簽名(ring)之中(這不影響隱匿性地址或保密交易協定,僅影響環狀簽名)。此外,當你在其他鏈上使用相同的金鑰之後,你的私鑰安全性將依賴那些第三方的信用。

  • 分叉者們: 如果你們要分叉Monero區塊鏈,請不要要求使用者重複使用他們的私鑰,而是讓使用者在你們的新鏈上產生新的私鑰。
  • 使用者們: 如果分叉者要求你在他們的新鏈上輸入你的Monero金鑰(在這篇文章發表之後),他們很有可能正在試著操縱你參與大規模的Monero攻擊事件。

請注意安全,並不要在Monero以外的用途重複使用你的Monero金鑰。

本文譯自getmonero.org https://getmonero.org/2018/02/11/PoW-change-and-key-reuse.html

開發者會議紀錄 DevMeeting 20180128

  • 開發者發現防彈協定可使用”批次認證”的方式大幅增加運作速率。
    • 就一般的複雜度而言,可縮減至僅需約15%的時間。
  • 若對門羅幣的Debian套件有興趣的人們,歡迎加入這個討論
  • 門羅幣GUI的部分:
    • 已將子地址功能納入。
    • 已將付款ID和整合型地址的功能移除。
    • 增加了--bootstrap-daemon-address參數,希望可以加快同步的速度。
  • 2018三月的硬分叉
    • 如先前的討論所述,防彈協定在主要網路正式啟用前還需要更多的研究,因此並不會在2018年三月的硬分叉植入。
    • 有在計畫要降低手續費,改變公式會如何影響整個網路還在研究中。

繼續閱讀...

開發者會議紀錄 DevMeeting 20171217

  • 增加了關閉DNS查詢的指令 (為了離線模式而設計的)
  • 防彈協定(BP)已開始在測試網路(testnet)中運作了
    • 協定中的數學部分已經很仔細的審視過了,並無明顯的錯誤,是時候來測試了
    • “對加密學來說最好的測試就是時間” -- Surae
    • 關於何時可以在主要網路中啟用BP的部分討論了非常久(佔了絕大多數的開會時間),選項分別有2018三月或九月的硬分叉
    • 防彈協定若無法趕上三月的硬分叉,屆時可能會另有替代方案暫時降低手續費
  • 門羅幣硬體錢包小組今天有個可以簡化韌體升級程序的重大突破
  • 下一次會議時間是2018年的一月14

繼續閱讀...

關於Monero手續費的一份筆記

近期社群中不斷有抱怨認為Monero交易的手續費過於昂貴。雖然我們並不同意其中的一些意見,但我們還是必須先徹底地分析一下這個情況。在那之前我們必須回應一點,有些抱怨認為開發者理當要將手續費直接修改降低後釋出新版本,但這樣的作法是因小失大的,因為 1. 這個方法只是把問題向後拖延;2. 改變參數與公式需要進行硬分叉,而這需要全面的共識;3. 每當價格變化後就得介入調整手續費的作法與去中心化的生態是矛盾的。

繼續閱讀...

防彈協定(Bulletproofs)將為Monero帶來更低的手續費

這是一篇關於防彈協定(Bulletproofs)的進度簡述與其在Monero上的應用介紹。簡單來說: 這協定令人驚艷,有效地降低了手續費,且已準備好要在測試網路(testnet)上開始測試。

現行的保密交易技術(confidential transactions, CT)可將Monero的交易金額隱藏,但為了確保所有人都可以驗證交易輸入和輸出的總和為零,我們使用具有代數性質的承諾協議(commitment),此外,我們還需要確保所有數值為正值以免造成溢位(overflow)的風險,此時範圍保護(range proofs)就發揮了作用。範圍保護可以讓每個人得以將承諾協議限制在一個特定的範圍內進行驗證,並完全不洩漏其他的交易資訊。我們現行的範圍保護協定會因交易輸出增加與範圍長度(目前為64bit)而使得容量大小呈現線性成長,這就造成了肥大的交易容量。不僅如此,若是交易中有多筆輸出,每筆輸出都需要分別有各自獨立的範圍保護,更會大幅增加交易容量,這並不是一件好事。

感謝Bünz、Bootle 與其他作者近期發表的一篇論文 (原文在此),他們在論文中提出了一個更有效率的範圍保護協定,稱為防彈協定。該協定的範圍保護容量僅在範圍大小與輸出數量同時增加時才會對數成長。因此防彈協定就分為兩種方案: 單筆輸出與多筆輸出的交易。多筆輸出的交易可以是多個單筆輸出或是一個多筆的輸出組成(這會比各自獨立的範圍保護來的省容量)。

讓我們來看看一個標準的雙筆輸出交易,也就是一筆傳送出去和一筆找零回自己錢包的輸出。以Monero現行的範圍保護協定下,這樣的交易容量約為13.2kB。若改用單筆輸出的防彈協定後,容量將只需要2.5kB,節省了將近80%的容量,等於節省了80%交易使用區塊的容量,也連帶地降低了80%的交易手續費。若使用多筆輸出的方案甚至可以節省更多的容量。另外,在我們的初步測試中,防彈協定認證所需的時間也比現行協定來得更快,也就是可以加速區塊鏈的驗證速度。

我們已完成了可運作的防彈協定JAVA測試程式碼(GitHub repo在此),單筆輸出與多筆輸出方案皆有。而單筆輸出的方案已經被moneromooo改寫成C++的版本(PR在此),並且會在近期放上測試網路,正在徹底的檢查與測試程式碼。

而多筆輸出的防彈方案還需要多點時間進行確認,因為防彈協定的驗證所需的運算是與輸出數呈線性正相關(容量為對數相關),攻擊者可能會利用這點打包一筆巨大數量輸出的交易,這可能讓攻擊者得以用小額的手續費來耗費巨大的驗證運算資源,讓交易網路壟罩在著阻斷服務攻擊(denial-of-service attack, DoS)的風險下。因此我們必須調整手續費的架構,必須額外考慮到所耗費的運算資源來計算手續費,這不代表手續費會被提高,而是讓手續費在因應輸出增加時的計算方式能夠更加適當且安全。

為了避免產生任何預期外的問題,我們將會以兩階段的方式來啟用防彈協定,你會先看到單筆輸出的方案上線,常見的雙筆輸出交易將會暫時以兩筆分別單筆輸出的方案的方式使用,即便如此也比現行的方案節省了可觀的容量,你將會發現交易手續費變低和錢包驗證速度加快。我們將會繼續研究多筆輸出防彈方案和其手續費架構的微調,最後將會在第二階段將之啟用,我們希望礦工是在手續費計算架構安全的情況下才使用多筆輸出的防彈方案。

總而言之,防彈協定給Monero交易帶來了巨大的進步,可觀的容量節省,更快的錢包驗證速度,以及更低的手續費。如果你有在使用測試網路,千萬別錯過近期就會投入測試的防彈協定!

翻譯原文來源: https://getmonero.org/2017/12/07/Monero-Compatible-Bulletproofs.html

將MyMonero網頁版錢包匯入至GUI錢包

MyMonero是許多人使用的熱門網頁版錢包,使用上方便不須煩惱同步問題,但畢竟是線上服務,偶爾會發生服務中斷或延遲等狀況,這篇要來教你怎麼把MyMonero的金鑰匯入到官方的GUI錢包。 首先必須說明一點,Mymonero用的種子碼是舊式的13字記憶種子碼(seed),而官方的錢包是25字種子碼,所以MyMonero的13字並無法適用一般的25字種子碼的回復方法,必須從MyMonero網站上取得個別的金鑰來匯入GUI錢包。

  • 點選從網站上的右上角Account/Account Details

  • 就會出現個別的錢包金鑰 (請注意這些金鑰等同於種子碼一樣為機密資訊,切勿外露)

  • 接著啟動GUI錢包,選擇中間的從金鑰回復錢包選項。

  • 輸入你想要的錢包名稱,選擇金鑰還原後就會出現各個金鑰的欄位。
  • 將剛剛網站上的個別金鑰逐個填入。
  • 回復特定高度若不清楚可不填。
  • 最後一欄可指定產生的錢包檔案儲存的位置

  • 接著為你的錢包檔案設定一個密碼

  • 設定完成後就會看到錢包開始同步區塊找回錢包餘額啦!

  • 需額外注意的是,用金鑰還原的錢包不會有種子碼資訊,因為從種子碼到金鑰是無法逆向解密的。所以從MyMonero取出金鑰匯入之後,原本的種子碼還是要收好以備不時之需喔!

若你對GUI錢包的使用不熟悉,可以參考GUI錢包的使用教學遠端節點的使用

開發者會議紀錄 DevMeeting 20171203

  • MRL 已有可運作的多筆交易輸出的bulletproofs的java測試程式碼了
    • 目前正在轉換為C++的版本(不包含多筆輸出的部分)
    • 此技術對於手續費架構的影響也在研究中(輸出筆數若很大量可能會造成DoS)
    • 單筆輸出的bulletproofs大小約略是704bytes,雙筆輸出則是768bytes左右。而依照目前門羅幣現行的版本,單筆輸出的大小是6k,雙筆輸出則是12k。
    • 多數的bulletproofs在測試時平均大小約為2.2k
    • bulletproofs可能會包含於門羅幣的2018九月硬分叉
    • 供測試網路使用的版本可能會在一周內完成
  • 為了準備發布新版本,程式碼將會在本月(2017十二月)底凍結
  • Surae Noether 的multiSig植入工作已經差不多完成檢查
  • 程式碼凍結時預計會包含到multiSig (因此multisig也會出現在下一發布版本中)
    • 若有開發者對multiSig的開發方向和程式碼有興趣,現在是最好的時機到github上看看
  • ZeroMQ(0MQ) 也預計會出現在下一個版本中,但此刻還有缺一些功能
  • 依然在研究是否可以把門羅幣的亂數生產器(Random Number Generator)換成比特幣用的版本

繼續閱讀...

架設Monero獨立節點教學

本篇文章將帶領你建架設獨立的完整節點(Full-node)或是遠端節點(Remote-node)

錢包跟節點的關係?

一個完整的Monero錢包 = 區塊鏈同步程式 (節點) + 錢包工具程式

以上就是Monero錢包的基本架構,這就也是為什麼每次打開GUI錢包時會自動出現區塊鏈同步程式啟動的原因。 因為錢包的運作需要依賴區塊鏈同步程式將區塊鏈的資料經由點對點(P2P)的方式下載到電腦上,再經由錢包工具程式掃描在區塊鏈中屬於自己的可用餘額;而每當你需要發送交易時,則是透過錢包工具程式利用私鑰簽署完交易之後,再經由區塊鏈同步程式透過P2P的方式將交易廣播到網路上。因此,運作中的區塊鏈同步程式在Monero點對點的網路中就是扮演一個節點(node)的角色。

節點、完整節點、遠端節點 有什麼不一樣?

前一段提到的錢包節點,它所負擔的工作只有下載區塊鏈資料和廣播錢包發出的交易,這樣可以確保區塊鏈資料是經過自己驗證的,但是,這些區塊鏈資料是從哪裡來的呢? 就正是世界各地的完整節點(Full-node)們提供的,其實區塊鏈同步程式在啟動的時候都會嘗試著透過port 18080和網路上的其他節點溝通,所以只要port 18080是暢通的狀況下,區塊鏈同步程式除了下載區塊鏈資料以外也會同時上傳區塊鏈資料給其他需要同步的節點,此時我們就稱為這個節點為完整節點(Full-node),也就是對Monero網路提供了完整的支援工作。 而至於遠端節點(Remote-node)則是指區塊鏈同步程式單獨存在而沒有錢包工具在同一台電腦上的節點,錢包得透過網路與區塊鏈同步程式連結,如此一來,一個區塊鏈同步程式所擁有的區塊鏈資料就可以被好幾個錢包所利用,於是使用者就不需要在每一台要用錢包的電腦上放著一份動輒數十GB的區塊鏈資料庫,也可以省去每次重新下載區塊的等待時間。

架設獨立節點的好處

  • 完整節點(Full-node)身負著去中心化的重責大任,線上的完整節點的數量越多,Monero網路也就越安全。
  • 遠端節點(Remote-node)通常是長時間放置,隨時與區塊鏈100%同步,如此一來,當你隨時需要使用錢包時就可以連接上這個遠端節點,省去區塊P2P同步的冗長時間,只需要從遠端節點資料庫裡掃描餘額即可;此外,遠端節點也可以讓多個裝置共用,譬如手機和筆電上的錢包都可以透過同一個遠端節點來運作,本站的公共節點服務就屬於此類的節點。

在開始之前,請先至官方網站下載最新的Monero CLI錢包檔案,壓縮檔內即含有monerod.exe,基本操作的官方說明可參考這邊


獨立完整節點(Full-node)架設方式

  1. 確認電腦上的tcp port 18080沒有被防火牆或防毒軟體阻擋。
  2. 確認路由器裡的port forward有被正確的將tcp 18080指向到該台電腦,並可能需要固定IP。
  3. 建立一個bat檔啟動monerod.exe,內容範例: monerod.exe --db-sync-mode safe --block-sync-size 20 --fluffy-blocks --data-dir D:\路徑
  4. 讓monerod執行一段時間後輸入指令status查看,若有節點連入(in)則代表設定成功。

獨立遠端節點(Remote-node)架設方式

  1. 確認電腦上的tcp port 18081沒有被防火牆或防毒軟體阻擋。
  2. (若有從外網連結的需求才做) 確認路由器裡的port forward有被正確的將tcp 18081指向到該台電腦,並可能需要固定IP。
  3. 建立一個bat檔啟動monerod.exe,內容範例: monerod.exe --db-sync-mode safe --block-sync-size 20 --fluffy-blocks --data-dir D:\路徑 --rpc-bind-ip 192.168.xx.xx --confirm-external-bind --restricted-rpc
  4. 等待節點完成同步後,即可使用錢包設定端節點至該遠端節點的IP,設定連接步驟可參考這篇文章

啟動參數介紹

  • --db-sync-mode 此參數可設定模式,safe效能較差但資料安全性較高,fastest則反之。
  • --block-sync-size 此參數可以設定區塊同步批次容量,10-200皆可,可依網路狀況選擇。
  • --fluffy-blocks 此參數可啟用fluffy blocks功能,節省區塊傳輸時的網路使用量。
  • --data-dir 此參數可以指定區塊鏈資料儲存的位置,預設為C:\ProgramData\bitmonero
  • --rpc-bind-ip 此參數須設定該台節點的IP。
  • --confirm-external-bind 此參數為允許外部錢包連入的必要參數。
  • --restricted-rpc 此參數可限制外部使用數個與安全性相關的API,建議使用。
  • --rpc-bind-port 此參數可更改預設的連入port 18081為指定數字。