概念的區別:Epoch & storageLimit
以太坊區塊鏈中只有主鏈上的交易是有效的,所以可以認為以太坊區塊鏈賬本是一條單鏈,從前往後每個區塊都有一個編號,叫做區塊號( block number),conflux 開發了一種全新的賬本結構: 樹圖,實現了高吞吐,低延遲。
在樹圖區塊結構中,如果只看父邊他是一個 Tree,如果父邊引用邊都看則是一個 Graph。正是這種結構使得 Conflux 網路可以併發出塊,即多個區塊可以都在某個區塊之後生成。因此在 Conflux 是沒有 block number 的概念。 但為了實現全序,Conflux 通過 GHAST 規則從創世區塊開始,在其所有子區塊中選擇最重子樹 block 為 pivot block,所有的 pivot block 鏈到一塊也形成一條鏈 定義為 pivot chain,如果只看 pivot chain 其跟普通的區塊鏈結構一致,在這條鏈上基於每個 pivot block 定義一個Epoch,因此你可以把 conflux 中的 Epoch 理解為跟 block number 對應的概念,只不過 conflux 中的每個 epoch 中可能會有多個 block。
在現實世界中,傳送轉賬交易需要給銀行付手續費,在比特幣中傳送交易需要給礦工付手續費,在以太坊中同樣如此。具體來講,以太坊網路的交易最終是由礦工 執行的 EVM 執行的,gas 是用來衡量一筆交易執行的工作量(可以理解為工作的工時),交易傳送者,傳送交易時可以指定願意給每個工作量付的價格即 gasPrice。 因此最終一筆交易的手續費為 gas * gasPrice。 在傳送一筆交易時指定的 gas 則是一個限制值,即傳送方最大願意為一筆交易支付 gas 這麼多的工時,如果交易需要的工作量超過 gas,則不會再付錢,交易不會被執行。
在 Dapp 系統中,交易執行除了需要礦工進行計算付出計算資源外,還需要礦工儲存合約的狀態,因此需要付出儲存資源。在 Conflux 系統中傳送交易時,還需要為狀態儲存 抵押一部分費用,因此在 conflux 中傳送交易時會比以太坊多一個 storageLimit 引數,用於設定願意為某筆交易儲存所抵押的費用上限。在合約釋放掉使用的儲存空間之後,抵押的費用 也會得到返還。
開發工具區別
Conflux區塊鏈現有開發工具主要有 Conflux Truffle
與 Conflux Studio
, 其功能主要對應以太坊使用最廣的開發工具的Truffle
和 Remix
。
Conflux-Truffle Vs Truffle
Conflux-Truffle
為以 Truffle
為原型改造的服務於conflux區塊鏈的合約開發工具。 詳細瞭解請參看Conflux-Truffle
使用教程。 其與Truffle
的區別主要有以下幾點。
1. 名稱
專案名稱 | npmjs 包名 | 安裝後的命令列程式名稱 |
---|---|---|
Conflux-Truffle | conflux-truffle | cfxtruffle |
Truffle | truffle | truffle |
2. Ganache
VS conflux-rust docker
Ganache
為 Truffle 官方提供的用於方便開發智慧合約時快速啟動以太坊私鏈的一個工具。
conflux暫時沒有Ganache
對應版本,但conflux提供了conflux-docker
,使用方法也很方便,啟動conflux-docker
預設也會啟動一個私鏈,分配10個初始賬戶並分配cfx, 且會自動 unlock 這些賬戶。
它們的最大區別是Ganache
提供了一個圖形化介面可以檢視私有鏈執行情況,及做一些簡單功能互動。conflux後續會提高使用者體驗相關的功能。
3. subcommand
子命令 | Truffle是否支援 | Conflux-Truffle是否支援 |
---|---|---|
build | 已過時 | N |
compile | Y | Y |
config | Y | Y |
console | Y | Y |
create | Y | Y |
debug | Y | Y |
deploy | Y | Y |
develop | Y | N |
exec | Y | Y |
help | Y | Y |
init | Y | Y |
install | Y | Y |
migrate | Y | Y |
networks | Y | Y |
obtain | Y | Y |
opcode | Y | Y |
publish | Y | Y |
run | Y | Y |
test | Y | Y |
unbox | Y | Y |
version | Y | Y |
watch | Y | Y |
ctxtruffle
除了不支援子命令 cfxtruffle develop
外,其餘子命令名稱及使用方式均與trffule
一致; 後續版本中會增加該功能。
4. subcommand context
當執行cfxtruffle console/exec/run
時,依然可以通過 js-sdk
相關api
與 conflux
互動,同時也注入了js-conflux-sdk
的Conflux
及Util
模組,可以通過 cfx
及cfxutil
使用。 如下所示
# cfx
cfxtruffle(development)> await cfx.getBalance('0x148A9696F8DCf4d6cB01eC80F1047a3476bA5C56')
cfxtruffle(development)> await cfx.getNextNonce("0xbbd9e9be525ab967e633bcdaeac8bd5723ed4d6b")
# cfxutil
cfxtruffle(development)> let drip = cfxutil.unit.fromCFXToGDrip(0.1)
cfxtruffle(development)> let randomKey = cfxutil.sign.randomPrivateKey()
5. 本地簽名遠端部署
truffle
中可以通過設定HDWalletProvider
來呼叫本地錢包進行簽名,cfxtruffle
只需要在網路配置中設定 privateKeys
欄位即可,該欄位是一個私鑰陣列,當傳送交易或部署合約時會自動從改 privateKeys
列表中選取對應的私鑰進行簽名。示例如下
Truffle
設定
// truffle-config.js
testnet: {
provider: new HDWalletProvider("3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9580", "http://localhost:7545"),
network_id: "*",
// 注意:從 portal 獲取的私鑰需要新增 0x 字首,privateKeys 也可以指定單個 key,若配置了私鑰,請注意不要將程式碼上傳到公開程式碼倉儲中。
// privateKeys: ['your-private-key']
}
Conflux-Trffle
設定
// truffle-config.js
testnet: {
host: "test.confluxrpc.org",
port: 80,
network_id: "*",
// 注意:從 portal 獲取的私鑰需要新增 0x 字首,privateKeys 也可以指定單個 key,若配置了私鑰,請注意不要將程式碼上傳到公開程式碼倉儲中。
// privateKeys: ['your-private-key']
privateKeys: ['0x3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9583','0x4f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9581']
}
6. 呼叫rpc時的引數
如前文所示,由於conflux中的共識方式與以太坊不同,增加了epoch及storageLimit的概念,所以在通過rpc與conflux互動時經常需要傳這些引數,具體不同請參見rpc及sdk區別
Conflux Studio VS Remix
Conflux Studio 是一個幫助開發者快速開發 Conflux 智慧合約的整合化開發環境。其與Remix類似提供了圖形介面讓開發者與合約互動。
Remix是基於瀏覽器端的應用程式,而Conflux Studio 是一個獨立的可執行程式,除了程式型別區別外,其功能及使用方式上也有很多區別
功能 | Remix | Conflux Studio |
---|---|---|
編輯合約 | Y | Y |
除錯合約程式碼 | Y | N |
合約錯誤檢查 | Y | N |
編譯及部署合約 | Y | Y 在Project頁面操作,內部實現為呼叫Conflux-Truffle 編譯 |
顯示編譯及部署結果UI(包含 ABI 及 Bytecode) | Y | Y 在ABI Storage中檢視合約編譯歷史的ABI, |
設定gaslimit | Y | N |
部署合約時設定建構函式引數 | Y | N |
根據 ABI 和地址載入合約例項 | Y | N |
Tuple傳參 | Y | N |
支援編譯優化 | Y | N |
支援自動編譯合約 | Y | N |
合約互動UI | Y | Y 在Contract頁面操作 |
命令終端 | Y | Y |
在命令終端中與sdk互動 | 命令終端中注入了web3 | N |
連線節點 | 通過設定node url連線 | 提供Network選項卡,可以本地建立節點,也可以選擇testnet和mainnet |
建立節點並管理節點 | Y | N |
內建執行環境JavaScript VM | Y | N |
初始賬戶Accounts | 自動分配,或通過metamask匯入 | 手動根據keystore匯入 或 通過IDE建立 |
支援外掛安裝 | Y | N |
記錄交易供replay(包含交易雜湊,交易建立合約的abi) | Y | N |
Unit Test | Y | N |
匯入專案 | 從本地及其它源匯入專案,如github,gist,ipfs等 | 內建了智慧合約模板, 在 Project 頁面操作 |
賬戶瀏覽器 | N | Y 在Explorer頁面位址列中輸入賬戶地址檢視 |
相關資料庫: