關於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錢包的使用教學](https://lafudoci.gitbooks.io/monero-xmr/content/full-monero-client-gui.html) 與 [遠端節點的使用](https://xmr-tw.org/2017/09/10/monero-gui-remote-node/)。

開發者會議紀錄 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為指定數字。

開發者會議紀錄 DevMeeting 20171119

  • MRL小組已對BulletProofs做了徹底的研究
    • 可直接替代原先的range-proofs功能,容量大小約略是原先的10%
    • 速度基本上是一樣的… 或許可以變快一點點
    • 近期會把程式碼從Java test code 改寫成C/C++
  • MultiSig的開發持續進行中
  • 許多錯誤修正的程式碼已陸續被併入專案 (hyc 算過了, 一共72個)
    • 掩飾使用者輸入密碼時的密碼長度
    • 資料庫鎖定資料機制的更新
    • BSD的版本問題修復
    • 修正了show_transfers的多筆交易input顯示不全的問題
  • 硬體錢包
    • 團隊成員有二十位了
    • 第一個里程碑已完成
    • 原型會在本周的慕尼黑門羅幣會議展出
  • monero-core 的GitHub專案被正名為 monero-gui
  • Monero 整合小組已準備好發佈 Magento 電子商務插件下一個正在朝OpenCart電子商務插件進行整合。

繼續閱讀...

Monero發布新版本v0.11.1.0更新

更新總覽

此次發布的版本 v0.11.1.0為小幅度的問題修正更新。 此項更新是基於v0.11主版本的更新修正而來,主版本v0.11為因應先前九月十五號硬分叉的必要更新。該次分叉將提高了環狀簽名的大小限制為5,並踢除在環狀簽名中重複的交易輸入。這次釋出的新版本提供了許多改進並及大量的bug修復。 關於此次小幅度問題修正的一些重要更新內容:

  • 修正一個當交易池中出現重複交易時的同步失敗問題

  • 新增了在低區塊高度時的數值下限檢查機制

  • 新增了當產生的區塊無法從交易池中找到所有的交易時的保護機制

  • 修復了當交易輸入數量較大時的交易容量的預估問題

  • 修復了LMDB在32位元系統上的問題

  • 將 get_tx_backlog 此RPC呼叫改為不受限制的呼叫

  • 改善交易確認時產生的例外狀況

  • 修復一個當檢查未確認前的交易時可能造成的程式錯誤

  • 其他數個問題修正與改善

    繼續閱讀...

開發者會議紀錄 DevMeeting 20171022

  • 最近已合併進主程式碼的新功能
    • 支援輕量化錢包的新API
    • 子地址功能 (Sub-addresses)
  • 一個新的發布版本(0.11.0.1)將帶來數項問題修正,最早可能會在2017年10月23日禮拜一發布。(但還會啟動上面的兩項新功能)
  • 有關dotnetrussel’s(Verge)的推特機器人的討論
    • 這真的不值得花力氣討論,因為這根本不是漏洞。
    • 它只是透過”nestat”的指令監測該IP的port連線狀況。並不代表任何Monero的使用者或任何一筆交易。
    • dEBRUYNE可能會寫一些正式的文案出來闢謠。
  • 日後有關Monero硬體錢包的討論很可能會轉移到Monero社群會議(Monero Community meeting)
  • redfish 和hyc 正在著手處理資料庫同步和損毀的問題

繼續閱讀...

開發者會議紀錄 DevMeeting 20171001

  • 一款名為Monerujo的Android錢包APP已在google play商店正式發佈
  • vtnerd 公佈了一個用於測試錢包掃描速度的工具,並比較了各種不同密碼學函式庫與方法(方法大多來自MRL提供)造成的差異
  • MRL 打算在今天要釋出一份有關subaddresses的資料,但必須先將格式整理好
  • Sarang 繼續埋首研究聚合簽名(aggregate signature)
  • FFS(論壇資助系統)正在重新設計成可以直接植入getmonero.org網頁中的形式
    • 模擬畫面
    • 可能會重新命名。CFS(Community funding system-社群資助系統)?
  • Monero專案的授權問題極度需要討論
  • Purism(https://puri.sm)目前對於將Monero預設直接植入他們的Debian(PureOS) 版本中十分感興趣
    • 這也意味著可能可以推廣到Debain的上游程式碼中
    • 如果有任何人正在運行PureOS (https://pureos.net/),Monero開發團隊希望可以得到一些Monero在上面運行狀況的意見回饋
  • 十二月將會有個”Monero月”的計畫
    • Monero 將會出席CCC(34C3)-跟BTC團隊與riat團隊一同出席。討論串位於 #monero-ccc
    • 將舉辦 Monero 維也納見面會

繼續閱讀...