開源礦工的開發耗費了我很多精力,到今天已經整出了10萬行代碼,但是缺乏文檔和注釋,不是因為刻意不添加注釋,而是因為添加的注釋會讓人不知所雲。可能大部分開發者不熟悉開源礦工的開發模式,需要先有個鋪墊,后續的文字就是用來做這個鋪墊的。開源礦工不是OO也不是過程,它是面向數據編程,它是系統編程。
一,從0開始
我們相信所有的系統都是從0開始的
我們相信,所有的系統都是從0開始的。
所謂從0開始就是從虛無開始,軟件系統一定也是從0開始的。0可以稱作Void、Virtual什么的,Void已經被編程語言占用了,那么我們用Virtual吧。
我們相信,所有的系統在空間結構上都是樹形的,軟件系統肯定不例外。
樹是一個奇妙的結構,只要你願意你所掌握的一切知識都是樹形,你未掌握的知識也是樹形。不做多說,開源礦工系統在空間結構上和行為結構上都要有Root(根)概念。開源礦工有根,構建開源礦工的編程語言有根,開源礦工所生存的運行時環境也有根,下層的事物我們不做追究,開源礦工作為生存在操作系統時空中的一個小小的應用系統來說只感知自己所需要感知的環境即可。
我們相信,所有的詞匯都應該按照望文生義理解
你望文生義出來的意思就是本真的意思,凡是不能望文生義的或者望文生義出的意思和聯想不一致的語言文字載體都已經被前人丟棄或者遲早被后人丟棄。我們不使用不能望文生義的詞匯。
從源代碼的VirtualRoot類型開始。望文生義,這是虛無,這是根。這是第一個出現的東西,它處在開源礦工的最底層,所有上層建築都建立在它之上。它下面肯定也有東西,但那是編程語言和運行環境的世界,我們的世界從VirtualRoot開始。
VirtualRoot
VirtualRoot是個靜態類型,它不是被我們構建而生的,有世界的時候它就已經在那里了,它是從0開始的0,它是整個世界的根。VirtualRoot根上掛載的事物也全都是靜態的在世界開始的時候就已經在那里的事物,直接掛載在VirtualRoot上的事物有:
- JsonSerializer 它是粉碎機,它是重建器,它安裝在系統的出入口處,開源礦工內部的物體流出系統前會被它打碎成下層系統的物體,下層原子世界不需要我們關注;外部系統的事物在進入我們的系統后首先會被它重建成我們的世界里事物的樣子。我們的系統只有一個入口和一個出口,這唯一的出入口就是VirtualRoot,是根。
- MessageDispatcher 推進器、動力源,或者其它什么名字,照此理解就可以了,開源礦工系統內部運動的動力之源就是它,至於它的動力又是來自CPU這種下層世界的事物又超出我們的世界之外去了。
- CommandBus 命令電車,它由MessageDispatcher驅動,MessageDispatcher不是裝在它里面的引擎,MessageDispatcher是電。它運載命令,命令是一種消息,消息是一種空間結構體。
- EventBus 事件電車,它由MessageDispatcher驅動,MessageDispatcher不是裝在它里面的引擎,MessageDispatcher是電。它運載事件,事件是一種消息,消息是一種空間結構體。
Message
上面知道VirtualRoot上掛在的CommandBus和EventBus分別是運載命令和事件的,而命令和事件是兩種不同類型的消息。消息是什么?消息是消息的收發方所協定的承載信息的空間結構體,空間結構體是什么?就是一段樹枝,樹枝的枝杈相對位置和長短編碼了能被收發方所理解的信息。
Command
事情發生前的消息。
Event
事情發生后的消息。
Path
路徑,消息所運動的路徑。
二,認識系統內的空間和時間
域是空間場所
通過上一部分我們知道所有的詞匯都應該是通過聯想望文生義的,那么作用“域”的域指的就是地域、場所、空間單元、資源組織結構,不管這個詞出現在什么領域,不管這個詞出現在人類知識樹的什么節點它指的意思都是空間場所。
域是組織結構單元
通過上一部分我們知道所有的系統在空間結構上都是樹形,樹是一種構造規律,它是對集合的有序帶偏移量的分層排列。域就是集。
域中的成員也是域
描述域之前我們需要先描述出域中的成員,它們是:幣種、內核、礦池 等。每一個成員是一個體,這個體是空間結構體,而空間結構體是一段樹枝,所以說你可以認為每一個成員是一段樹枝。這一篇我們在從域的角度描述問題,域是集,而樹是有序集,所以一段樹枝就是一個域,而幣種、內核、礦池等空間結構體是一段段的樹枝,所以說域中的成員也是域。就像房間里有櫃子,櫃子里有抽屜,抽屜里有盒子,盒子里有手機,手機空間里的東西超出了我們的世界進入到未知的域外世界去了我們不關心。房間外面有樓,樓外面有地球,地球外面又到域外世界去了也和我們沒關系。
人的思維是被觀察者域的域外維度
人的思維沒有尺寸,它可以進入天體也可以進入原子,因為它根本可以不在木星上或原子內,它是在被觀察者外部的世界,它是在觀察者自己的內部世界建立的一種和外部世界的對應關系。人的思維可以進入天體也可以進入原子,這種進入運動是人腦內部在自己的內部世界的運動而並非真的進入了外部世界。
運動 —— 我們需要准確認知自己當前所處的觀察者位置
通過“事情發生的場所”這句話我們知道重點在於“事情”,在於“發生”,在於“變化”,在於“運動”。 我們的思維沒有尺寸,它可以在自己構建的對外部世界的映射的內部世界里任意行走。但我們需要准確認知自己當前被自己投射到了哪里。 “發生”是一種變化,是運動。空間一但變化就產生了時許概念,順序一旦產生就有了前后、里外、長短等概念。觀察者和參照點隨之而生。 空間是一種相對靜止的存在,就像人有五肢,我們可以將人體看作一棵樹,頭、雙手、雙腳5肢的相對位置在這棵樹上來說是固定的相對靜止的,當我們說人體5肢之間的關系是靜止的時候我們將自己放在了這個樹的域中,此時作為觀察者的我們進入了這段樹枝的世界,我們要准確的認知此時自己無法從樹枝的一個枝丫跳進樹外然后再由樹外到達另一個枝丫,我們必須在樹上運動,所以這段樹枝的相對關系是靜止的。觀察者和參照點隨運動而生,我們必須准確認知自己作為觀察者當前所處的位置和觀察的方向,我們必須能夠意識到作為觀察者的自己有沒有變換位置。
開源礦工這棵系統樹內部划分有5大域
開源礦工這棵系統樹內部划分有5大域。這5大作用域是:幣種集、礦池集,內核集、幣種x內核集、礦池x內核集。我們說開源礦工內部有這5大域,而不是說總共只有這5大域,因為開源礦工這棵樹作為一個整體也是域啊,系統內部的每一個對象也是域啊,而是說這5大域是值得顯式化描述的5大域。請記住它們,它們是:幣種集、礦池集,內核集、幣種x內核集、礦池x內核集。
三,界定系統的內外
識別系統的內外
這個系列每一篇都很短,主要用於將開源礦工架構和源代碼中的每一個值得說明的概念都描述出來,因為開源礦工的源代碼上的注釋實在太少,不是因為刻意不添加注釋而是因為它的源代碼組織結構和運行時景象和大部分程序員平時所掌握的不太匹配,添加的注釋會讓人不知所雲。 所以決定先有這個系列,先熟悉一下抽象的大致輪廓再去接觸開發就像是帶着地圖去那里行走不至於迷路,后續會添加注釋,添加的注釋往往會是一些表地點的名詞和表運動的動詞往往不是完整的句子。
數據結構
在上一部分我們知道域是地域,是資源組織結構,其實就是空間,就是計算機領域所說的數據結構。在第0篇我們信仰所有的系統在空間結構上都是樹形,之所以用“堅信”、“信念”這樣的詞是因為我們不想證明它,我只在意這個斷言能否幫助我節能高效的工作。現在我們將具體化,將樹形構造定律幻化到計算機領域的數據結構,我們認為:一個位是一個具有一個分叉的樹,一個字節是一個具有8個分叉的樹,一個int32是一個具有4個字節分叉的樹……,由性別(2個位表示男、女、未知)、年齡、姓名組成的Person數據結構是由底層樹組成的高層樹。並且為了概念的完整性我們認為一個位也有兩個枝杈,位的兩個枝杈是0和1,它們是最小的不可分割的粒子,計算機世界是離散的世界正是因為到了01后不再可以分割。 現在當我們再次說開源礦工系統是一棵樹的時候,在空間結構上可能就是在說開源礦工的根、樹枝、葉子等數據結構了。
系統內外的界定
上一部分我們還說樹是添加了偏移量的集合,既然是集合那一定有內外。我們認為在空間維度樹的根是最大的集合、葉子是最小的集合,在行為維度葉子是最大的集合,根是最小的集合,也就是說我們認為當我們用相對靜止的眼光看系統的時候我們在關注空間,當我們以運動、變化的眼光看系統的時候我們在關注時序。在前篇我們也多次提到邊界、域就是地域邊界,當我們認一個方向樹的邊界有兩端,在操作系統看來開源礦工是個進程(資源樹),操作系統的進程概念是比開源礦工更大的概念,涵蓋的空間更大所以是更大的集合。在一棵更大的樹中進程可以被看作開源礦工的根,但這超出了我們的系統進入到域外世界去了。前篇我們還提到原子也超出我們的世界了,原子只是個比喻,這里的原子指的是bit、和由bit組成的bool、int等,因為它們在我們的世界來說沒有意義,幣種、礦池、內核等才是我們的世界的事物,幣種礦池內核等數據結構中被我們取了名稱的屬性(或者叫字段)也是我們的世界的事物,而屬性是由bool樹、int樹、byte樹組成的,這里的bool、int、byte、bit等概念也不屬於我們的世界,它們就是我們說的原子世界,它們是計算機行為的根,因為計算機在運行時只認它們,所以說在運行時這個時序維度或者叫運動維度根是bit。兩頭的世界我們都不關心,它們都是我們的外。
外屬性 —— 需要感知的外部事物
通過上一段我們認知到開源礦工的生存環境在我們的系統樹外,組成開源礦工空間結構體的int、bool、bit也在我們的系統樹外。開源礦工系統需要感知自己的生存環境,感知外部世界就是擺動自己的域內世界從而建立和域外世界的對應關系。開源礦工需要感知的外部世界的事物我們就稱作外屬性。它們是:計算機名、物理內存、虛擬內容、BIOS信息、顯卡、驅動、文件系統等信息。
內屬性 —— 本系統內的一切事物
開源礦工的內屬性是什么?可以認為開源礦工系統內的一切事物都是內屬性。開源礦工展示給用戶的一切都是它的內屬性,只展示給開發人員的事物也是它的內屬性。開源礦工內部建立的對外部世界事物的對應也是它的內屬性,只有當我們在開源礦工域外比如在QQ系統中說計算機名、物理內存等外部事物的時候它們才是和開源礦工沒有關系的外屬性。
為什么我們要感知那么多外部世界,因為只要我們感知了所有需要感知的外部事物,就是說只要我們的系統內部具有和所需認知的外部世界的對應關系,這樣我們就能更好的適應生存環境,比如我們要支持無盤運行只需擺動開源礦工系統內部的一個參數即可。
開源礦工官網:https://ntminer.com/