【Paper 解讀】打造公平的遊戲轉蛋:在不洩漏原始碼的前提下驗證虛擬轉蛋的機率

這篇是 HITCON CMT 2023 的演講
今天就來解讀一下這篇在講什麼。我在現場聽的時候,被突如其來的數學打得頭昏眼花,事後看懂才寫了這篇xD

背景

丁特事件中,遊戲橘子公告的機率與實際上抽的機率不符合,但消費者又無法驗證,所以作者就想知道能不能設計出一個,可以在不開源的情況下驗證官方公告的機率是否為真的系統。以下是幾個重要事件的時間線。

  • 2021/06 → 轉蛋法聯署
  • 2021/08 → 丁特事件
  • 2023/01 → 轉蛋法生效,參考日本、韓國的轉蛋法

值得注意的是日本有限制保底抽數、金額。
而大家在意的是怎麼驗證機率。

Related Works

這邊提到了兩篇 related works,但有一些各自的問題

怎麼做

轉蛋主要由兩個部分組成,隨機來源 + 轉蛋函式。
所以要可以驗證轉蛋的機率代表我們需要,可以驗證的隨機來源 + 可以驗證的轉蛋函式

Verifiable Random Source

簡單作法

所有人提供一個 random number,把大家的 xor 起來
但是這樣做可能會有 Last Contribution Attack,也就是最後一個人 C 可以暴力的嘗試不同的 c 值,選一個可以中獎的,等於最後一個人可以操控結果

HeadStart

所以這邊他們改良了前面的作法,這個作法叫做 HeadStart,這也是作者同一個實驗室他們發的論文。
這個作法主要改動了兩個部分

  • 把大家的 random number 做成 Merkle Tree
  • 最後會經過 Verifiable Delay Function (VDF) 的運算得到最後結果

做成 Merkle Tree 的主要好處是,驗證只需要 O(logN) 的時間和空間

VDF 則是一個需要一定的時間計算,但是可以被迅速驗證 (有點像是 Blockchain 的 POC,但是 VDF 不能被 parallelized),因為計算需要一定的時間,所以就可以避免 Last Contribution Attack

Verifiable Function

接著有了 Verifiable Random Source 之後,我們還需要 Verifiable Function。
這邊作者直接採用了一種 Zero Knowledge Proof 叫做 PLONK。原本我們的函式長這樣 f(x) = y,那加上這個 PLONK 之後,他就會多吐出一個 proof 讓我們驗證,f(x) = y + proof。這邊其實不需要理解數學的細節,總之可以在不公開函式的情況下驗證你是用同一個函式去算出 x 的結果 y,而不是我給你輸入你才又偷偷換了另一個每次都抽不到的函式。如果真的想了解的同學可以看一下 Vitalik 大神的 ZKP 系列

實際的流程

前面介紹了必要的元件之後,我們就可以來看實際的抽卡流程是怎麼個樣子

Probability Verification Protocol

今天我想測一下這個遊戲的機率是不是唬爛的,我就可以發起這個驗證的流程 (沒有真的抽卡,只是模擬抽卡)。
可以想像函式 f 就是一個下面這樣的函式,吃兩個參數,random source r 和遊戲參數 o。
遊戲參數裡面會有像是 VIP 等級、抽卡次數等,比如抽卡次數就很有用,可以根據抽獎次數計算要不要保底。

1
2
3
4
5
6
7
8
9
10
11
12
13
def loot(seed, params):
random.seed(seed)
num = random.randint(0, 999)

# 20 抽保底
if params["抽獎次數"] >= 19:
return 1

# 機率 10%
if num < 100:
return 1
else:
return 0

  1. 首先,會有一個 Random Beacon 收集大家貢獻的 randomness,收集滿了之後,吐出 100 個 test data (模擬 100 次抽卡)
    • 假設是 m = 100 的話 (方便想像)
  2. 這些 test data 就會丟進去函式裡面運算,最後吐出 100 個 (抽卡結果, 證明),這些都會放在公告欄裡面
  3. 最後,玩家們就可以拿 test data 和公佈欄裡面的 (抽卡結果, 證明) 去驗證函式 (透過 PLONK 的 ZKP 證明)
  4. 驗證正確代表函式沒有被動手腳,所以就可以直接來算算看這 100 個抽卡結果的中獎機率是多少啦
    • 論文中還有計算說,如果官方說是 0.3 的機率,哪麼驗證出來的機率要小於多少就有很高機率他在說謊

Loot Box Opening Protocol

最後是真的要抽卡的時候的流程 (作者畫的圖好複雜,不貼了xD)

  • Setup
    • (Server) 先算出一個 Hash Chain,然後把 a_n 給玩家
      • a_i = H(a_i-1)
      • a_0 -> a_1 -> a_2 -> ... -> a_n
  • 以下步驟可以重複多次
    • Evaluation (開抽)
      • (Player) 隨機選一個 random 數 B,還有一些遊戲參數 O (比如 VIP 等級、抽獎次數等),傳給 Server
      • (Server) 上次 Hash Chain 選到 a_i,這次就挑 a_i-1。 計算 random source 等於 a_i-1 || B (合併雙方的 random source),帶入抽卡函式 f(a_i-1 || B, O) = y + proof。最後把結果 (y, proof, a_i-1) 傳回去給玩家
    • Verification
      • (Player) 拿到 proof 可以驗證是同一個函式
      • (Player) 拿到 a_i-1 可以驗證 H(a_i-1) = a_i (代表 Server 不是隨心所欲的亂選一個隨機數而是在玩家選出 B 之前就已經決定好 a_i-1 了)

這邊的重點其實是 Hash Chain 的部分,可以確保 Server 不是在收到玩家選的 random source B 之後,才挑一個抽不到卡的 random source。

結論

就是因為不想開源,所以才需要 ZKP,但仔細思考一下,其實 ZKP 的部分跟其他 Protocol 可以完全切開,ZKP 在這裡扮演的就是確保遊戲廠商至始至終都是用同一個函式,不會在模擬抽卡和真正抽卡的時候用不同的函式,這樣就可以用模擬抽卡來驗證機率了。把 ZKP 的部分去掉之後看,就會發現其實沒這麼複雜xD (不要上來就貼數學式RRR)

再來的問題就只是 Random Source 怎麼來

  • 模擬抽卡: 用 HeadStart 讓大家貢獻 Random Source
  • 真的開抽: Server 和 Player 雙方各貢獻一個 Random Source,然後 Server 用 Hash Chain 來證明他在 Player 選 Random Source 之前就已經選好了,不是拿到 Player 的 Random Source 才挑的

要開源的話,其實只要抽卡部分的程式碼可以開源就好了吧,這樣就完全不用 ZKP,實作就只剩 Hash Chain 那邊要實作,其他通通不需要了,模擬抽卡什麼的也不用了,都已經有 source code 看就知道機率是多少,要驗證函式的話,你只要把輸入丟進去看輸出是不是一樣的就好。

References

Read more

【Windows 小知識】PE Section 大小

我們今天就來看這個 PE 的 Section 中 Raw Size 和 Virtual Size 的差別。
你可能會發現說大部分 Raw Size 會比 Virtual Size 還要大,這是為什麼呢?

要理解這一點,我們要先理解 Alignment 的概念。
每當系統在分配記憶體的時候,都需要進行 Alignment,確保記憶體位址是某個數值的倍數,這樣做不僅可以避免掉不少的麻煩,也讓記憶體管理變得更加簡單且直覺。

PE 的 Optional Header 中有定義兩種 Alignment

  • File Alignment: Raw Size 對齊的大小,預設是 0x200
  • Section Alignment: Virtual Size 對齊大小,預設是 0x1000

因此,回來看 Section 的大小會發現,PE 裡面寫的 Raw Size 其實是已經經過 File Alignment 處理過的大小,都是 0x200 的倍數。而 Virtual Size 是原始沒有進行 Section Alignment 處理的大小。

舉個上面那張圖的例子來看,程式跑起來的時候,.rdata 實際在記憶體中分配的大小是 0x2000 (0x1242 進行 Section Alignment 對齊 0x1000 完的結果),所以 .rdata 在記憶體的實際大小反而是比 Raw Size 大,而這些多出來的空間其實就是駭客最喜歡放 shellcode 的風水寶地啦xD

Read more

【Windows 小知識】檔案總管的排序規則

首先,先讓 ChatGPT 幫我開場一下,我覺得他腦補得好像還不錯xD

ChatGPT 小故事時間

曾經好奇過,當我們在 Windows 檔案總管中觀察文件列表時,是什麼魔法使它們按照這樣一個特定的順序排列的嗎?嗯,這就是我要告訴你的故事:一個叫做 StrCmpLogicalW 的神秘 Windows API 的故事。

想像一下,有一天,Windows 開發者們圍坐在一起,思考著如何讓檔案總管的排序更符合用戶的直覺。你看,當用戶看到 “img10.jpg” 和 “img2.jpg” 這兩個文件時,他們自然會認為 “img2.jpg” 應該在 “img10.jpg” 之前,即使從字母順序上看,“10” 確實是在 “2” 之前。但是,人們不是機器,我們的大腦認為 2 小於 10。這就是 Windows 開發者們需要解決的問題。

於是,StrCmpLogicalW 這個 API 應運而生。

我是某一天在找我的樣本的時候才發現這個神祕的排序
因為樣本大多是用檔案的 hash 當作檔名,所以會長的像下面這樣

1
2
3
4
5
6
7
8
9
10
11
1c8bb52633d0861e2137a984048bd224
4adc8224eb736aa10e168390ac8cc251
05ece5d005502c211d57c5028fcce17e
7c30d3db6f1a28c08a21fbf1bccf771f
9f6fc22fd9c97e68eda4e707e6200849
29d0984f03fd2cce2f57b17005ab8e0e
58f75d29b3675cadf8f4f25be1275838
0524df255a48254e8a7a39a20d7328e3
ae2219b53716336c3bb26f8a5ff693c0
d4a0c7c5ff0e88f31167a91085539fdd
d300c7c5ff0e88f31167a91085539fdd

一般正常排序會用字典序(Lexicographic order),所以第一個字母排起來應該要是 0, 0, 1, 2, ... 照順序排,但我們看到上面的例子,在檔案總管裡面,他是排成 1, 4, 0, 7, ... 這個奇怪的順序,到底在排什麼,我一開始注意到就是各種問號,後來查一查才發現他是用 StrCmpLogicalW 這個神祕的 Windows API 去比較兩個字串,這篇有比較細節的去介紹其中的機制,比官方文件詳細。

StrCmpLogicalW 在比較的時候是用 meta-character 當做單位,meta-character 有分三種

  • .
  • 數字
  • 其他字元

這三大類之間的排序是 . < 數字 < 其他字元,之後才是比較大類裡面的大小
重點就是這裡的數字是把整串的數字當作一個數值在比較
比如 29d0 就是把前面兩個數字當作 29 這個數值比較,所以 9f6f < 29d0 (9 < 29)
之所以要這樣排,應該跟 ChatGPT 介紹得差不多,為了讓一般使用者看起來更直覺,像是 img1.jpg, img2.jpg, …, img10.jpg 就會照 1, 2, 3, ... 的順序排了,就不會因為用字典序排,所以變成先 1, 10, 11, ... 1 開頭的排完才換 2 的 2, 20, 21, ...,這種一般使用者比較不習慣的排法。


Read more

【語言模型】繁中語言模型 bloom-1b1-zh 試玩

由聯發科(2454)集團轄下的前瞻技術研究單位聯發創新基地、中央研究院詞庫小組和國家教育研究院三方所組成的研究團隊,今日開放全球第一款繁體中文語言模型到開源網站提供測試。

來源: https://udn.com/news/story/7240/6991226

上禮拜聽說有新的繁體中文的語言模型釋出,想來玩一下,但是新聞上沒有放連結,找了一下才找到 bloom-1b1-zh,但是這個模型只有 2GB,不是原本 Bloom 的 1760 億參數的那個模型,是迷你版的,雖然 1760 億參數的模型我的電腦也跑不動就是了xD

安裝

先來說一下怎麼安裝,首先開一個 python 的虛擬環境,看你要開 venv 還是用 poetry 或是 conda 都可以,建議是裝在虛擬環境不要直接裝在本地套件,我這邊示範是開一個 venv 來安裝

1
2
python -m venv .venv
source .venv/bin/activate

接著就安裝 transformerspytorch
pytorch 可以去 pytorch 官網 上複製安裝指令,根據你的 OS 還有你的 CUDA 版本選不同的安裝指令,我是選 Stable (1.13.1) 和 CUDA 11.7,然後用 pip 安裝

1
2
pip install transformers
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

裝完之後,接下來就是下載模型,直接把 bloom-1b1-zh clone 下來,記得要裝 git lfs,或是你也可以手動載下來

1
git clone https://huggingface.co/ckip-joint/bloom-1b1-zh

載完之後執行以下腳本就可以開始玩了
這個腳本先用 from_pretrained 從剛剛下載的資料夾 ./bloom-1b1-zh 載入模型下面我寫了一個 while 迴圈吃使用者輸入還有輸出長度`,然後印出結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from transformers import BloomForCausalLM
from transformers import BloomTokenizerFast

model = BloomForCausalLM.from_pretrained("./bloom-1b1-zh")
tokenizer = BloomTokenizerFast.from_pretrained("./bloom-1b1-zh")

def gen(prompt, result_length):
inputs = tokenizer(prompt, return_tensors="pt")
return tokenizer.decode(model.generate(inputs["input_ids"],
max_length=result_length,
num_beams=2,
no_repeat_ngram_size=2,
early_stopping=True
)[0])

while True:
prompt = input("prompt: ")
length = int(input("length: "))
result = gen(prompt, length)
print(result)

實驗

先隨便抓一些新聞的開頭來試一下

1
2
3
4
5
prompt: 金管會要出手了!詐騙集團手法層出不窮,黃天牧今(2)日透露,最快2周內、3月底前將跟臉書Meta與谷歌二家社群平台開會
length: 300

金管會要出手了!詐騙集團手法層出不窮,黃天牧今(2)日透露,最快2周內、3月底前將跟臉書Meta與谷歌二家社群平台開會,討論如何打擊詐欺集團。
「黃大哥」表示,目前詐詐集團已從社群網站下手,但臉書的社群功能較弱,因此,他會與Google、Facebook等平台商討論,如何加強社群的防範功能,讓社群更安全。</s>
1
2
3
4
5
prompt: 「這是希臘史上最嚴重的火車意外之一,也是歐債危機以來撙節開支的後遺症...」希臘當地時間2月28日午夜的火車對撞的嚴重事故,目前
length: 100

「這是希臘史上最嚴重的火車意外之一,也是歐債危機以來撙節開支的後遺症...」希臘當地時間2月28日午夜的火車對撞的嚴重事故,目前已經造成至少50人死亡,超過200人受傷。
希臘總理帕潘德里歐在記者會中說,事故發生後,希臘政府已經下令,所有公共運輸系統,包括火車、巴士、地鐵、公車等,都必須關閉,直到救援工作完成為止。</s>

怎麼出現 詐詐集團,竟然疊字裝可愛?!
看起來產生的文字還算通順,他還會自己加一個 </s> 停止符號,代表他說完了

接下來嘗試讓他完成一些對話

1
2
3
4
5
prompt: 甲:「你好!」乙:「
length: 300

甲:「你好!」乙:「我很好,謝謝你.」丙:「你怎麼了?」丁:「沒事,只是有點感冒,請你多保重,我會好好照顧你的.」「謝謝,」甲說,「我一定會照顧好你的,你放心吧!」「好,我放心了!我一定要好好保護你,不要讓
任何人傷害你!你一定要保護好自己,別讓別人傷害自己!你要好好愛惜自己的身體,要好好養生!不要生病!要養好身體!我要好好地照顧你!」乙說:「好!謝謝你的關心!我會照顧好的!你也一定要好好的照顧我!我們一起努力!一起加油!加油!」丙說:「我真的很感謝你對我的照顧!我也很想你啊!我好想見見你呀!好想!我很想聽你說話!我想聽聽你的聲音,我想和你說話,想和你聊天!可是我怕你聽不到我說話的聲音,因為我害怕你 聽到我的聲音會生氣,會不高興,所以我就不敢說!因為我知道,如果我不說的話,你會生氣、不開心!所以,我要說出來,讓你知道我有多愛你、有多想你好好地愛護我、照顧我好嗎?」「我當然會!我相信你愛我,我也相 信你對我很好!但是,如果你不愛我了,我不會怪你的!我不怪你什麼!我只怪我自己太愛

看起來整個壞掉了阿,後面一直在跳針,是可以閱讀但是沒有邏輯,可能是輸入資訊量太少嗎
隨便找個網文小說來給他產產看

1
2
3
4
5
6
prompt: 葉琮叼著一根稻草,雙手抱後腦勺,用一本書蓋在臉上,擋住直射來的陽光,愜意的躺在山坡草地上享受著午休時光。"葉琮哥!"一個紅頭發的小男孩兒揮著手跑了過來。葉琮無奈的睜開眼,在他頭上輕輕敲了一下:"焱,說過多少次了,不要在我午休的時候打擾我。"對於像他這樣喜歡在夜晚活動的打更人來說,午休是格外重要的。
length: 500

葉琮叼著一根稻草,雙手抱後腦勺,用一本書蓋在臉上,擋住直射來的陽光,愜意的躺在山坡草地上享受著午休時光。"葉琮哥!"一個紅頭發的小男孩兒揮著手跑了過來。葉琮無奈的睜開眼,在他頭上輕輕敲了一下:"焱,說過多少次了,不要在我午休的時候打擾我。"對於像他這樣喜歡在夜晚活動的打更人來說,午休是格外重要的。但是,他卻從來沒有過午睡的習慣,所以,在葉家,只有他一個人午睡了,其他的人都是睡覺的。他睡得特別香,睡得很安穩,甚至連呼吸聲都聽得到。這天,葉家的午飯時間到了,大家都在院子裡吃著飯。突然,一個聲音響起:"喂!葉哥,你醒醒,快起來吃午點吧。""我怎麼會醒來啊?我睡著了,怎麼
可能醒過來?""你睡著的時候,我一直在看書,看什麼書啊?"一個大大的黑眼睛,一雙黑亮的大眼睛。這個黑眼珠子,就是葉瑋瑄。她長得很漂亮,眼睛很大,很亮,而且很黑,就像一顆黑珍珠。她的臉蛋很圓潤
,五官很完美,皮膚很白皙,眉毛很濃,嘴唇很紅,鼻子很挺,嘴巴很薄,下巴很尖,小巧玲瓏,嬌小可人,非常惹人憐愛。可是,她卻是個很膽小的孩子,膽小得連自己都害怕,更別提別人了。有一次,她在院子里玩,不小心跌倒在地,被一個小男孩撞到了。那個男孩一看到她,就跑過來抱住了她。那時候,她的心就像被針扎了一樣,疼得直發抖,但是她還是咬著牙,勇敢的站了起來,跑向了院子的另一邊。就在她跑得快,腳步蹣跚,快要摔倒時,突然有一股力量把她從地上拉了回來。原來,那個小男生就是她爺爺,爺奶奶,還有她外婆。他們都抱著她哭著跑來,抱住她說:"葉

問題好像還是一樣,還算可以閱讀,但完全沒有邏輯

讓他產產看英文好了,他的 base model 應該是英文的模型吧

1
2
3
4
5
6
7
8
9
10
prompt: Japan's Prime Minister Fumio Kishida has been criticised for saying the country's ban on same-sex marriage is not discriminatory. Weeks ago, he apologised to the LGBTQ community over homophobic comments made by an aide who has since been sacked. Mr Kishida's party is under growing pressure to improve LGBTQ rights, as more Japanese support same-sex marriage. Japan remains
length: 500

Japan's Prime Minister Fumio Kishida has been criticised for saying the country's ban on same-sex marriage is not discriminatory. Weeks ago, he apologised to the LGBTQ community over homophobic comments made by an aide who has since been sacked. Mr Kishida's party is under growing pressure to improve LGBTQ rights, as more Japanese support same-sex marriage. Japan remains one of the few countries in the world to ban same-sex marriage, but the government has said it will not change its position.

The government's decision to allow same sex marriage in Japan was announced in March, after a government-appointed panel of judges ruled that the law was discriminating against gay people. The ruling was criticised by the gay community, who said they were being discriminated against by Japan's government. In a statement, the Japan Society for the Prevention of Cruelty to Animals (JSPCA) said: "We are deeply saddened by this ruling."

"We strongly condemn the ruling and urge the Japanese government to reconsider its decision," the group said. "It is clear that Japan has a long way to go before it is able to fully respect the rights of all people, regardless of their sexual orientation or gender identity, to live in harmony with one another and to enjoy the same rights and freedoms as everyone else in society, including the right to marry and have a family. This ruling is a clear example of how Japan continues to discriminate against the most vulnerable and marginalised groups of society. It is also a sign of a lack of respect for human rights in this country, which is why we are calling on Japan to take urgent steps to ensure that all its citizens enjoy equal rights to life, liberty, and the pursuit of happiness, without discrimination based on their gender, sexuality, religion, or political beliefs.

(Reporting by Yuki Yamaguchi; Editing and editing by David Jones)</s>

有些瑕疵但好像還行,中間還跑出 Japan Society for the Prevention of Cruelty to Animals (動保團體)?

1
2
3
4
5
6
7
8
9
10
11
12
13
prompt: # calculate Fibonacci sequence\ndef fibo(x):
length: 200

# calculate Fibonacci sequence
def fibo(x):

return x**2 + x + 1

# generate a random number
rand = random.randrange(0, 100)
print(rand)

</s>

想說測試一下他會不會寫 code,他格式有寫對,但產出來是不正確的結果,還自己寫了額外的產亂數的 code
對一個 2GB 的繁體中文模型是不是要求太多了xD

結論

總結來說,用新聞的文章讓他接龍產出來的文字還算通順邏輯也沒問題,但是寫小說就完全不行,會一些英文也會一些 code,以一個 2GB 的小模型來看,還算可以吧,不知道哪時候會釋出 1760B 參數的模型出來,不過釋出了應該也是個 360 GB 的模型,我的電腦就玩不起了呀xD


  1. https://towardsdatascience.com/getting-started-with-bloom-9e3295459b65
  2. https://huggingface.co/ckip-joint/bloom-1b1-zh
  3. https://udn.com/news/story/7240/6991226
Read more

【資安小知識】Linux Kernel 出漏洞 Ubuntu 該升級哪一版?

因為去年底出的一個新的 Kernel 漏洞 CVE-2022-47939,要幫忙檢查 Ubuntu 有沒有需要更新 Kernel,所以就寫了這篇記錄一下。

首先,這個漏洞在 mitre 的 cve 頁面 中寫了影響的範圍是 Linux kernel 5.15 through 5.19 before 5.19.2,出問題的是 ksmbd 這個 kernel module,他是在 5.15 版本被引入的,所以 5.15 之前的版本就沒事,最後是在 這個 commit 中修掉的,這個 commit 的 message 是 ksmbd: fix use-after-free bug in smb2_tree_disconect,跟在 mitre 的 cve 的敘述中寫的一樣,在頁面下方的 References 其實也可以看到這個 commit 的連結。

所以我們知道有問題的 Linux Kernel 版本是什麼,但是我要怎麼在 Ubuntu 上面看我的 Linux Kernel 是幾版,上網查一下或是問 chatgpt,其實就可以得到這個指令 uname -r,執行這個指令之後,在我的機器上給出了 5.15.0-58-generic 這樣的版本號,看起來是 5.15 版本,是在有漏洞的範圍裡面,但其實並沒有,因為這是 Ubuntu 自己 build 的版本號,並不是 Linux Kernel 的版本號,Ubuntu 的版本號的命名慣例是 <base kernel version>-<ABI number>.<upload number>-<flavour>,你會發現把剛剛的 5.15.0-58-generic 套在這個格式上看好像少了一個 upload number,我們可以用 cat /proc/version_signature 查看比較詳細的版本號,在我的機器上的結果是 Ubuntu 5.15.0-58.64-generic 5.15.74,分別是

  • base kernel version: 5.15.0
  • ABI number: 58
  • upload number: 64
  • flavour: generic
  • upstream linux kernel: 5.15.74

最後他還多給了一個 upstream linux kernel 的版本號。ABI number 指的是 kernel 本身開出來的 application binary interface 介面的版本號,如果你把 kernel 看成是一個後端 server,那他就是指你的 REST API 的接口,所以可能會跟 upload number 不同,因為可能兩個不同的 kernel 版本只是修了些 bug,沒有開新的 api,或是 api 的參數沒有變化,這時候這個 ABI number 就不會變。而 upload number 單純就是一個流水號,指從這個 5.15.0 base kernel version 長出來的第幾個版本,所以我們可以看這個號碼來分辨前後順序。

Ubuntu Secuity: CVE-2022-47939 發布的漏洞公告中,我們可以看到他有列出他們上 patch 的版本,Ubuntu 22.04 (jammy) 的是 5.15.0-53.59,我們可以直接去看 Ubuntu linux source package 中 5.15.0-53.59 版本的 Changlog,這裡我們搜尋 smb2_tree_disconect 就可以找到在這個版本的更新有納入 v5.15.61 upstream linux kernel 其中修掉了這次的 CVE-2022-47939,而我的機器是 5.15.0-58.64,是在 5.15.0-53.59 後面的,所以其實我的機器的 Linux Kernel 已經有修補掉這個漏洞了。

總結來說,在 Ubuntu 下 uname -r 得到的版本號其實不能直接對應到 Linux Kernel 的版本號,Ubuntu 本身是從 Linux 分支出來的,所以自己有一個版本號,我們這次介紹了 Ubuntu 版本號各個欄位的意思,並且找到我們的版本號其實是已經有上 patch 了,這樣之後出新的漏洞就可以知道要升級到哪個版本可以修補掉漏洞。

Read more

【程式語言】WTF Powershell

1
2
3
4
3..4+,2
3..4+2
2+3..4
,2+3..4

以上四句表達式,哪一個是不合法的表達式呢?







答案是第三句 2+3..4,他會噴出以下的 error

1
2
3
4
5
6
方法引動過程失敗,因為 [System.Object[]] 未包含名為 'op_Addition' 的方法。
位於 線路:1 字元:1
+ 2+3..4
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [],RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

一些背景知識

在詳細講解為什麼 2+3..4 會出錯之前,我們首先要理解 powershell 中的四個概念,都很好理解(有學過其他語言的話O_O),分別是

  • create array
  • nested array
  • append array
  • range

create array

要 create 一個 array 很簡單,只要用 , 逗號把數字隔開,像是 1,2,3 這樣,就是一個 array 了,不一定要有括號在外面

nested array

兩個逗號的話,像這樣 ,,1 就是一個兩層的 nested array,等同於 python 的 [[1]]

append array

在 powershell 中,串接陣列是用 +,要 ,2 陣列和 ,3 陣列串接的話就是 ,2+,3,等同於 python 的 [2] + [3]

range

和其他的一些語言(bash, rust, …)一樣,powershell 是採用 .. 來作為 range operator,像是 1..5 就等於 1,2,3,4,5

WTF Powershell

在複習了一些 powershell 的背景知識後,我們就來看看為什麼 2+3..4 會是不合法的表達式,明明對稱的另一個表達式 3..4+2 是合法的阿
首先就運算元的優先序來看,是 , > .. > + 的,所以我們可以把上面的四個表達式寫成

1
2
3
4
(3..4)+(,2)
(3..4)+2
2+(3..4)
(,2)+(3..4)

實際上這四句分別是

  • Object[] + Object[]
  • Object[] + Int32
  • Int32 + Object[]
  • Object[] + Object[]

回頭看一下 error message 你就會發現它其實就是在說不能把 Int32 + Object[]
但是 Object[] + Int32 卻可以,所以他只實作了一個方向的加法? WTF Powershell?
不過換個方向,用 python 的角度來看,他其實像是 a = [3, 4]; a.append(2) 是可以的,但是沒有 a = 2; a.append([3, 4]) 這種寫法

總而言之,因為 Powershell 把 Object[]Object[] 的 concat 和 Object[]Int32 的 append 混著用都是用 + 一個 operator 搞定,所以第一次看的時候會有些頭昏眼花,但其實還勉強算合理,不像隔壁棚的 javascript 群魔亂舞的。Powershell 的部分之後應該還會有更新,大家下集再見。

Read more

【Writeups】Flare-on 9

01 - Flaredle

1
2
3
4
5
6
const CORRECT_GUESS = 57;
let rightGuessString = WORDS[CORRECT_GUESS];
if (guessString === rightGuessString) {
let flag = rightGuessString + '@flare-on.com';
...
}

flag 就是 WORDS[57]

02 - Pixel Poker

1
2
3
4
if (x == 0x52414c46 % 741 && y == 0x6e4f2d45 % 641) {
# print flag
...
}

點選 (95, 313) 這個格子就會噴出 flag 如下

03 - Magic 8 Ball

LLURULDUL 方向鍵
然後在下面輸入 gimme flag pls? 就會噴出 flag 如下

04 - darn_mice

1
2
3
4
5
for (int i = 0; i < 10; i++) {
void *ptr = malloc(0x1000);
*ptr = payload[i] + input[i];
(void(*)())(ptr)();
}

每個 byte 都會被當成 1-byte shellcode 呼叫,只有全部都是 0xc3 也就是 ret 才不會 crash

flag 是 i_w0uld_l1k3_to_RETurn_this_joke@flare-on.com

05 - T8

這題給了一隻 PE 執行檔和一包 pcap

程式一開始會有個 anti-debug,判斷時間是滿月的時候才能執行
他有一個函式是在計算月亮的週期 OwO

pcap 裡面有兩個 requests 兩個 response
總之動態追一下可以發現他計算 request 內容的邏輯
基本上他就是用 RC4 加密,他產的 key 是 FO9 加上 0 到 65535 之間隨機一個數字,比如 FO91234,做 md5 的結果
所以爆搜一下就可以解出封包的內容,爆搜程式碼如下,要注意 wide string 的轉換 O_O

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import hashlib
from base64 import *
from Crypto.Cipher import ARC4

def to_wide(x):
return b''.join([bytes([i, 0]) for i in x])

def check_wide(x):
for i, j in enumerate(x):
if i % 2 == 1 and j != 0:
return False
return True

def gen_key(x):
return to_wide(hashlib.md5(to_wide(x)).hexdigest().encode())

def rc4(key, m):
return ARC4.new(key).encrypt(m)

enc_req = b64decode("ydN8BXq16RE=")
enc_res = b64decode("TdQdBRa1nxGU06dbB27E7SQ7TJ2+cd7zstLXRQcLbmh2nTvDm1p5IfT/Cu0JxShk6tHQBRWwPlo9zA1dISfslkLgGDs41WK12ibWIflqLE4Yq3OYIEnLNjwVHrjL2U4Lu3ms+HQc4nfMWXPgcOHb4fhokk93/AJd5GTuC5z+4YsmgRh1Z90yinLBKB+fmGUyagT6gon/KHmJdvAOQ8nAnl8K/0XG+8zYQbZRwgY6tHvvpfyn9OXCyuct5/cOi8KWgALvVHQWafrp8qB/JtT+t5zmnezQlp3zPL4sj2CJfcUTK5copbZCyHexVD4jJN+LezJEtrDXP1DJNg==")

for i in range(256 * 256):
key = gen_key(b'FO9' + str(i).encode())
dec_req = rc4(key, enc_req)
if check_wide(dec_req):
dec_res = rc4(key, enc_res)
break

print(dec_req)
print(dec_res)

然後解出第一個封包的內容之後,裡面的內容是用 , 分開的如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\xe5\x07\t\x00\x03\x00\x0f\x00\r\x00%\x00\x03\x00b\x02
\x00\xdc\x07\n\x00\x06\x00\r\x00\r\x00%\x00\t\x00*\x03
\x00\xe1\x07\x0c\x00\x04\x00\x07\x00\r\x00%\x00$\x00\xe5\x00
\x00\xe0\x07\x05\x00\x05\x00\x06\x00\r\x00%\x00\x0b\x00&\x00
\x00\xe2\x07\n\x00\x01\x00\x08\x00\r\x00%\x00\x1f\x00E\x03
\x00\xe6\x07\x03\x00\x02\x00\x01\x00\r\x00%\x002\x00\xda\x00
\x00\xde\x07\x07\x00\x02\x00\x16\x00\r\x00%\x006\x00\xd1\x02
\x00\xde\x07\x05\x00\x03\x00\x0e\x00\r\x00%\x00\x01\x00\xe8\x00
\x00\xda\x07\x04\x00\x01\x00\x05\x00\r\x00%\x00:\x00\x0b\x00
\x00\xdd\x07\n\x00\x04\x00\x03\x00\r\x00%\x00\x16\x00\x16\x03
\x00\xde\x07\x01\x00\x02\x00\x0e\x00\r\x00%\x00\x10\x00\xc9\x00
\x00\xdc\x07\x0c\x00\x01\x00\n\x00\r\x00%\x000\x00\x0c\x02
\x00\xe6\x07\x02\x00\x01\x00\x1c\x00\r\x00%\x00"\x00K\x01
\x00\xe6\x07\t\x00\x05\x00\t\x00\r\x00%\x00!\x00m\x01

每行都是代表某年某月某日,然後算一下是陰曆幾號,再把那個數字對到 a-z0-9 就可以組出 flag 了,大概吧 O3O?
反正後來我覺得好麻煩,就直接把解出來的封包內容倒回去 debugger,flag 就掉出來了 O_O

flag 是 i_s33_you_m00n@flare-on.com

看 code 點我

06 - à la mode

這題乍看之下是 .NET 程式
但用 dnspy 翻了一下發現沒什麼東西
在逛 PEBear 的時候就看到了 .NET Header 裡面的 Flags 寫了 Native EntryPoint

咦?難道這是隻普通的 dll
直接抄起我的 IDA Pro 和 x64dbg
咻咻咻,一陣亂跳,看到了一些 pipe 的東西,再多翻一下就翻到某個地方長得很像是在 decode flag 的地方,還有出現 MyV0ic3 字串
難道是要 create pipe 然後傳這個字串,好像很麻煩,我直接手起刀落把 cmp 的另一個變數一樣改成 MyV0ic3,再按了幾下 step over,登登,flag 就出現在 memory 了

flag 是 M1x3d_M0dE_4_l1f3@flare-on.com

p.s. 解這題的時候剛好要出門吃飯,原本想說只是先看一下題目,沒想到 flag 就自己掉出來了xD

07 - anode

這隻程式是用 node.js 寫的,是用 nexe 這個東西打包的
用文字編輯器打開看一下就會發現檔案最後面有 js 原始碼

js 原始碼裡面有一大堆的 switch case
主要的邏輯就是把你的輸入 -> 做一連串的 add, sub, xor 的操作 -> 檢查跟某個值是不是一樣的,是的話你的輸入就是 flag

我們可以直接去改最後的 js 原始碼,只要讓整個檔案的大小不變就不會噴 error,他執行的時候應該是直接抓一個固定的 offset?
加了一行 require("a.js"),這樣我就可以直接跑我自己的 js
簡單測試了一下,發現 node.js 被改過了,random 的輸出不 random,其他一些運算也被改過
正常來說是要比對一下原版的 node.js 和這個改過的 node.js 差在哪裡
但是我覺得好麻煩,我直接用 visual studio code 的超強 replace 功能把那一大串的 add 換成 sub,sub 換成 add,然後當做字串推到一個陣列
接著把陣列倒過來,拿去 eval 就可以 flag 了 OwO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
...

/* 原本
case 1071664271:
if (Math.random() < 0.5) {
b[17] += b[0] + b[35] + b[12] + b[42] + b[14] + b[3] + 8;
b[17] &= 0xFF;
} else {
b[18] ^= (b[20] + b[23] + b[6] + b[12] + b[4] + b[25] + Math.floor(Math.random() * 256)) & 0xFF;
}
state = 175099911;
continue;
*/

// 處理過
case 1071664271:
if (Math.random() < 0.5) {
commands.push(`b[17] -= b[0] + b[35] + b[12] + b[42] + b[14] + b[3] + 8`);
commands.push(`b[17] &= 0xFF`);
} else {
commands.push(`b[18] ^= (b[20] + b[23] + b[6] + b[12] + b[4] + b[25] + ${Math.floor(Math.random() * 256))} & 0xFF`);
}
state = 175099911;
continue;

...

var b = [106, 196, 106, 178, 174, 102, 31, 91, 66, 255, 86, 196, 74, 139, 219, 166, 106, 4, 211, 68, 227, 72, 156, 38, 239, 153, 223, 225, 73, 171, 51, 4, 234, 50, 207, 82, 18, 111, 180, 212, 81, 189, 73, 76];
commands.reverse().forEach(command => eval(command));
console.log(b)

flag 是 n0t_ju5t_A_j4vaSCriP7_ch4l1eng3@flare-on.com

p.s. 雖然 flag 說 not just a javascript challenge,但是我完全把他當作 javascript 來解了,抱歉了xD

08 - backdoor

這題被大家說是全部裡面最難的,我覺得是蠻麻煩的,找不到地方偷吃步,或是其實有但我不知道xD (可以偷偷告訴我 O_O)

這隻是 .NET 的程式,dnspy 打開會看到一堆的 try except
一開始跑下去都會進到 except 裡面
因為他是在 except 裡面去建出一個 DynamicMethod,再把正確的 IL code 塞進去跑
但如果你直接把動態跑的時候看到的那段 IL code 抓下來塞回去檔案裡面,會發現還是錯的
因為他有一段是在做 dynamicILInfo.GetTokenFor,是在把外面世界的 metadata token 換成 dynamicILInfo 世界中的 metadata token,所以不能直接把那個 IL 複製出來,要複製再早一點還沒有換掉的,然後把正確的 metadata token 放上去
這邊我因為沒有找到好方法 (對 .NET 不熟 QQ),所以是用 dyspy 動態跑,手動複製出 IL code 和 metadata token,然後寫個 python script 去改原本的執行檔,最後可以正常的 decompile 所有函式

接著看到了一些 powershell command $(ping -n 1 10.10.21.201 | findstr /i ttl) -eq $null; 拿去 google 了一下就找到了這篇 APT34 targets Jordan Government using new Saitama backdoor
長得一模一樣,這題就是從這隻惡意程式改的

其中在處理不同的 task 的部分有發現一些在做比較字串的程式碼
感覺跟 flag 有關,就仔細看了一下,發現他是要依照某個順序把每一個 task 都跑過一次,就會去印 flag
他印 flag 的地方是從 PE 的 5aeb2b97 這個 section 抓資料出來,然後拿去解,中間還會跟 stacktrace 的字串攪在一起,十分的噁心
後來受不了,沒有可以偷吃步的地方,還是乖乖地寫了一個 dns server 跟程式互動,按照步驟去發 task id,執行完之後就噴出 flag 了

flag 是 W3_4re_Kn0wn_f0r_b31ng_Dyn4m1c@flare-on.com

看 code 點我

09 - encryptor

這隻是一個 Ransomware,標準的用 Symmetric Encryption 做加密,再用 Asymmetric Encryption 加密 Symmetric Encryption 的 key
很快就可以看出他有做 chacha20
但是一直找不到他用什麼 Asymmetric Encryption,一直在想是什麼複雜的加密演算法,一開始懷疑是 ECC,後來又再猜 NTRU
我看那個迴圈感覺很像是在做快速冪,在想是哪個演算法會做快速冪,不會是 RSA 吧他寫的那麼複雜,到底是哪個,等等難道真的是 RSA
後來測試一下,發現真的是 RSA,因為他在做大數的運算所以看起來很複雜,那些函式就只是在做加法乘法模運算而已 Orz

反正他就是把檔案做 chacha20 加密,加密用的 key 再用 RSA 做加密
RSA 加密之前先用 e=0x10001 去算出對應的 d,然後加密是直接 m^d % n
等於我們直接用 c^e % n 去解密就好

flag 是 R$A_$16n1n6_15_0pp0$17e_0f_3ncryp710n@flare-on.com

10 - Nur geträumt

這題是 m68k 的程式,非常古老的東西,要古董 Mac 電腦才跑得起來
不過我們只要照著提示去用 Mini vMac 就可以跑起來了
稍微互動一下就可以發現它其實就是在做 xor encryption,就是會把你輸入的 key 重複貼上直到跟被加密的內容等長,然後做 xor

所以重點就是,要輸入什麼 key?
已知最後面一定是 @flare-on.com 所以可以先解出 key 的最後 13 bytes 是 du etwas Zei
然後搭配他在程式裡面塞的一堆提示,就可以找到這首歌 NENA | 99 Luftballons [1983] [Offizielles HD Musikvideo]
google 一下他的歌詞就會發現第一句歌詞就是 key …
有幾個不是英文字母的在裡面,不過 flag 都是英文,猜一下也還好

flag 是 Dann_singe_ich_ein_Lied_fur_dich@flare-on.com

p.s. 這題最麻煩的步驟是把 encrypted flag 複製出來…

11 - The challenge that shall not be named.

這題是用 python 寫的,用 pyinstaller 打包成 exe
所以起手先用 pyinstxtractor 解出原始的 pyc (版本是 3.7.0)
然後再用 python-decompile3 解回原本的 python source code
接著就會發現他有用 pyarmor 做混淆

直接用 python 去跑解出來的 .py 檔案,會發現它噴了一個錯誤,而且有 stacktrace,位置是在本地的 crypt 函式庫
裡面有用到 linux 平台才有的東西,有點古怪
我就直接去改那個 crypt.py,把 import _crypt 註解掉,然後就會發現他去呼叫 crypt 的時候找不到 _crypt,因為我們沒有 import 他
可以直接讓他 return None,接著就又看到他去呼叫 ARC4,一樣直接改他

1
2
3
4
5
6
7
def ARC4(x):
print('arc4', x)
class A:
def encrypt(self, y):
print('arc4.encrypt', y)
return b''
return A()

然後 flag 就被我們印出來了xD

flag 是 Pyth0n_Prot3ction_tuRn3d_Up_t0_11@flare-on.com

Read more

【漏洞分析】CVE-2022-41049

11/08 Windows 的 Patch Tuesday 中修補了兩個關於 Bypass Mark-of-the-Web (MOTW) 的漏洞,分別是 CVE-2022-41049 和 CVE-2022-41091,在 Exploring ZIP Mark-of-the-Web Bypass Vulnerability (CVE-2022-41049) 這篇部落格中,有詳細的分析這個漏洞的細節,也是本篇部落格主要參考的來源

這個漏洞最早在 6 月在 twitter 上 Will Dormann 的貼文中 就有提及
並且在 10 月就有在野外觀察到這個漏洞被利用

Alternative Data Stream (ADS)

要解釋這個漏洞之前,要先說明一下什麼是 Alternative Data Stream (ADS)
ADS 是 NTFS 檔案系統的一個功能,允許一個檔案可以有多個 Stream,也就是雖然檔名是一樣的,但是透過不同的 Stream 可以存取到不同的資料
比如 test.txt 這個檔案可以有好幾種不同的 Stream

  • test.txt::$DATA
  • test.txt:Zone.Identifier
  • test.txt:Hello
  • test.txt:World

MOTW

瀏覽器會把從網路下載下來的檔案,新增一個 Zone.Identifier 的 Stream,這就是傳說中的 Mark-of-the-Web (MOTW)
我們可以用 Powershell 下指令 Get-Item <filename> -Stream * 來列出某個檔案的所有 Stream 如下圖所示

接著用 Get-Content <filename> -Stream Zone.Identifier 去印出 Zone.Identifier Stream 裡面的資料如下圖所示

可以看到 Zone.Identifier Stream 裡面存了 ZoneIdHostUrl 這些 metadata

那有 MOTW 的檔案可以做什麼?
有 MOTW 的檔案就等於給其他軟體們一個資訊,這個檔案是來自網路,像是 WORD, EXCEL, Visual Studio 等軟體以及 Windows 本身,在處理這些檔案的時候就會格外小心,並且對使用者發出額外的警告,像是如下圖的這些警告

CVE-2022-41049

背景知識都補充足夠了,那這個 CVE-2022-41049 的漏洞又是出了什麼問題
正常情況中,檔案總管 (Explorer) 在解壓縮 zip 的時候,會把 zip 檔案的 MOTW 複製到解壓縮出來的所有檔案上面
但是只要那個 zip 檔案是用某個特別的方法製作的時候,MOTW 就不會被傳遞下去,也就成功 Bypass MOTW

這個特別的製作方法,說起來也不是那麼特別,其實也是正常的 feature
只要你的檔案在壓縮的時候是 read-only 的
在解壓縮的時候,因為檔案是 read-only 的關係,所以檔案總管就無法去寫入 MOTW 到解壓縮出的檔案上面
就是這麼簡單,非常簡單就可以實作

這篇 Exploring ZIP Mark-of-the-Web Bypass Vulnerability (CVE-2022-41049) 部落格中,作者做了非常深入的調查,最後才發現只是這麼簡單的原因,原文分析的思路也推薦大家可以看看
除了 zip,其他的打包格式比如 iso, vhd, gzip 等,也是新的 bypass MOTW 的方法
整體來看,Mark-of-the-Web (MOTW) 其實不算是一個 Security Boundary,比較像是一個額外的警告功能,使用者在下載網路上的資源的時候還是要謹慎小心,多看幾眼xD


  1. https://breakdev.org/zip-motw-bug-analysis/
  2. https://www.ithome.com.tw/news/154096
Read more

【部落格開發】日誌 0x03

部落格要恢復更新啦

距離上次更新也過了一年多了,期間為了更加客製化主題,還想過要自己從頭刻部落格,真是太天真了啊
最後還是回來用新版的 icarus 主題,真香。
之前是把 icarus 主題跟部落格綁在同個 repo 一起更新,但這樣不好管理,所以現在就直接 fork 一份出來維護,是用最版的 5.0.0-rc.1,之後有新版本就再 merge 進來就好了。把之前做過得一些改動都整合進主題了,還是自己客製化過得最對味啊。
之後會慢慢把之前的文章再放回來,應該至少一週一更吧,希望xD

icarus 大改版

我之前用的 icarus 版本還在寫 .ejs
現在已經在寫 .jsx
之前的部落格開發日誌上的程式碼有些可能都不能直接套用了
不過不用擔心我現在已經把我改的程式碼推到 這裡

Excerpt

我發現 icarus 的 excerpt 可以寫在文章內容的開頭,而不用寫在 front matter
中間加一個 <!-- more --> 和文章主體區隔
像是下面這樣,或是看這裡範例

1
2
3
4
5
Hello, this is the excerpt

<!-- more -->

This is the article

這樣 excerpt 也可以快樂寫 markdown
在首頁也只會顯示到 <!-- more --> 之前的內容
但是點 Read More 的按鈕跳進去文章之後,會發現 excerpt 其實還在
只是頁面會捲動到 #more 這個 hashtag 也就是文章主體的開頭
不過這樣感覺只是一個偷懶的作法,不是一個完美的作法

Read more

【項目介紹】Flow ( Dapper Labs )

這個項目算是很新的項目,去年的 9/22 - 10/3 才在第一波 ICO,每人限購 1000 USDC,當時 ICO 的價格是一顆 FLOW 要價 0.1 USDC,到現在也漲了 200 倍了吧,只恨沒有買更多啊 Orz 不過要鎖倉一年,所以要到今年底才拿的回來,但是光是產生的利息就已經回本好幾倍了xD
好了,廢話不多說,下面來介紹一下 flow 的特點。

資源

這邊先放幾個連結,有興趣入門的可以看一下

特點

Flow 是專門為應用程式以及遊戲所開發的一條新的區塊鍊
在鍊上面可以用 Cadence 這個程式語言撰寫 smart contract,對比隔壁棚的 Ethereum 用 Solidity 寫 smart contract

Cadence 這個程式語言有什麼特點呢

  • Resource-Oriented Programming
  • Upgradable Smart Contract
    • 多了一個 beta state 可以讓你盡情的 upgrade,在這個階段,如果使用這要用就要自行承擔風險囉,話是這樣說的
    • 等到都測試完後,就可以正式 release 了,之後就跟隔壁棚 Ethereum 的 smart contract 一樣就不能再改他了
  • Built-in Logging Support
    • 只會在 transaction 上標記一個記號,你想要看 log 就自己在離線執行一次就可以看到了,不像隔壁棚 Ethereum 把 log 儲存在鍊上面
    • 在 Cadence 語言中就直接 log("hi") 就可以印 log 了,不像隔壁棚 Ethereum 還要先定義 event 再 emit

Flow 這條區塊鍊有哪些特點呢

  • 垂直分工 ( pipeline ),把問題切成四份,某種問題會有一種專門的節點負責處理
    • 不像隔壁棚 Ethereum 尋求 sharding 的解決方式,用平行分工把所有交易切成很多子鍊,多了很多問題
    • 分下面四種工作
      • Consensus Nodes : 共識機制在此發功,Flow 使用 HotStuff 共識機制
      • Verification Nodes : 檢查正確性,取締違規者
      • Execution Nodes : 執行交易附帶的那些計算工作,也就是 smart contract 裡面的程式
      • Collection Nodes : 負責包裝交易們處理些雜事,再丟給 Consensus Nodes,用來提昇整體區塊鍊的效率
    • 總而言之
      • Consensus 和 Verification 這兩種 Node 是安全守門員負責讓 Flow 更安全
      • Execution 和 Collection 這兩種 Node 是瘋狂機器人負責讓 Flow 更有效率跑得更快
  • 每個帳號裡面都可以有多個 smart contract,不像隔壁棚 Ethereum 的 smart contract 和 address 是一對一的關係
  • 內建支援 multi-signature,每個 key 會有一個 weight,只有你提供的 key 們的 weight 加起來有 1000 就可以做事情了
  • 聽官網介紹是說有帳號恢復機制,不清楚細節
  • 強調說他遵守了資料庫系統的 ACID ( Atomic, Consistent, Isolated, and Durable ) 原則,因為根本上區塊鍊就是一個去中心化的資料庫

如何成為節點

官方的文檔 - Setting Up a Flow Node

NODE TYPE CPU MEMORY DISK
Collection 2 cores 16 GB 200 GB
Consensus 2 coresv 16 GB 200 GB
Execution 16 cores 128 GB 2 TB
Verification 2 cores 16 GB 200 GB
Access 2 cores 16 GB 200 GB

Make sure you have a sufficiently fast connection; we recommend at least 1Gbps, and 5Gbps is better.

硬體要求還行,我的桌機好像還能跑,但是這個網速要求有點高啊
而且還要填表單申請,太中心化了啊
然後這裡有寫每種 node 要跑得話要 stake 多少顆 flow,最便宜也至少要 stake 135000 顆 flow,以目前的價格來看大概是 270 萬美金吧,我去

Flow 目前的一些問題

目前 Flow 還在初期階段,有些東西還沒搞好
下面一些資訊是我在 discord 群看到的

we still have a lot of things locked down in mainnet right now. The ability to create accounts is one of them. At this time only partnered wallets can create accounts. This will obviously be opened up in the future. At a minimum it won’t happen until fees are in place on mainnet.

  • qvvg on discord

主網路還沒好啊,不能隨意創帳號
需要他們合作的夥伴像是 blockto 才能創,可以用 https://port.onflow.org/ 這個創帳號的樣子
還不夠去中心化啊

Flow’s fee model is still under development, but will have transaction fees. The payer of a transaction can be separate from the authorizer, so dapps can easily pay for their users transactions. Flow keeps tx fees affordable and accessible for all.

  • Flow Assistant Bot on discord

手續費的機制也還沒弄好啊

Flow is an decentralized protocol being built in an open ecosystem - there is no formal roadmap but if you’d like to see areas people are currently expending effort you can take a look at issues currently in the GitHub repo https://github.com/onflow/flow/issues and feel free to create or comment on issues for anything that you think should exist on Flow.

  • Flow Assistant Bot on discord

沒有正式的 roadmap

Flow 的應用

  • NBA Top Shot: NBA 主題的 NFT,可以讓你收藏你最愛的球員,以及他們得分的片段等
  • VIV3: 買賣 NFT 的平台
  • MotoGP™ Ignition: 類似 Ethereum 上的 F1® Delta Time,同一批開發人員的樣子,只是從 F1 賽車改成 MotoGP 摩托車,可以組裝自己的車車然後跟別人比賽,下個月 3/26 開賣
  • CryptoKitties: 還在計畫從 Ethereum 遷移到 Flow,不知道是哪時候

總結

Flow 提出了很多方案來改進去中心化應用面臨到的問題,接下來就要靜待時間的考驗,等潮水退了就知道 Flow 有沒有穿褲子了

Flow to the Moon 🚀

Read more