Loom Network là gì ?
Loom Network là một giải pháp mở rộng lớp 2 cho Ethereum. Đây là một mạng lưới sidechains DPoS, cho phép các trò chơi và DApps trên nền tảng blockchain có khả năng mở rộng trong khi vẫn được hỗ trợ tính bảo mật của Ethereum. Nó cho phép các nhà phát triển chạy các ứng dụng quy mô lớn và là giải pháp mở rộng Ethereum đầu tiên được áp dụng vào thực tế.
The Loom SDK
Sản phẩm cốt lõi của Loom là SDK cho phép người dùng nhanh chóng xây dựng blockchain cho riêng họ mà không cần phải hiểu chi tiết về hạ tầng hay các thuật toán đồng thuận của blockchain. Hãy nghĩ về nó giống như một bộ tạo blockchain cho riêng bạn.
DAppChains
Loom SDK tạo ra một DAppChain – một blockchain hai lớp sử dụng Ethereum làm lớp cơ sở của nó. Việc chạy DApp trên sidechain đem lại cho Ethereum có một số lợi ích, nhưng quan trọng nhất: DAppChains có thể sử dụng các quy tắc đồng thuận (như DPoS) để tối ưu hóa cho khả năng mở rộng . Sử dụng Ethereum làm lớp cơ sở có nghĩa là các tài sản dựa trên DAppChain ( như tokens ERC20 và ERC721) có thể có được đảm bảo một cách an toàn.
Khả năng mở rộng DApps
Loom SDK cho phép người dùng chọn thuật toán đồng thuận, quy tắc để tùy chỉnh khả năng mở rộng hay bảo mật tùy theo nhu cầu DApps cần. Loom Network hỗ trợ DPoS (Delegated Proof of Stake), cho phép phát triển các ứng dụng trò chơi trực tuyến và mạng xã hội quy mô lớn . Đó là 2 loại DApp đầu tiên mà Loom tập trung vào phát triển (mặc dù người dùng hoàn toàn có thể xây dựng bất kỳ loại DApp nào trên SDK Loom) . Được liên kết với Ethereum thông qua Plasma trên nên có thể chuyển tài sản qua lại từ Ethereum vào Dappchain, để dễ hiểu thì các tokens ERC20 và ERC721 được sử dụng trên DAppChain trong khi vẫn được Ethereum bảo đảm . Nói tóm lại, SDK Loom cho phép các nhà phát triển xây dựng các loại ứng dụng giống như họ sẽ xây dựng trên EOS, nhưng được Ethereum hỗ trợ.
Để tìm hiểu thêm về Plasma có thể tham khảo bài viết :
https://viblo.asia/p/plasma-giai-phap-cho-su-mo-rong-mang-luoi-blockchain-tiep-theo-ByEZkybY5Q0
ring ring ring … giờ học lý thuyết đến đây là hết tiếp theo là đến giờ thực hành
Chạy và tạo ứng dụng đơn giản trên Loom Network
Download Loom
Bạn có thể sử dụng lệnh bên dưới để tải Loom ở thư mục hiện tại:
1 2 | curl https://raw.githubusercontent.com/loomnetwork/loom-sdk-documentation/master/scripts/get_loom.sh | sh |
Installation
Chạy các lệnh dưới đây ở cùng thư mục với file loom vừa tải về
1 2 | ./loom init |
Run
1 2 | ./loom run |
Chỉ với 3 lệnh bên trên bạn đã tạo được một mạng blockchain cho riêng mình rồi đấy
Deploy contract lên mạng Loom
Hãy bắt đầu với Solidity + Truffle
Bạn có thể cài đặt Truffle theo các hướng dẫn ở đây : https://www.trufflesuite.com/docs/truffle/overview
Và học về ngôn ngữ Solidity để viết contract tại đây : https://cryptozombies.io/
Deploying and run from Truffle
1 2 3 | # Currently supported version npm install -g <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="087c7a7d6e6e646d483d26382638">[email protected]</a> |
Giờ hãy tạo project nào
1 2 3 4 5 6 7 | # Create directory and access mkdir simple-store cd simple-store # Initialize a project from zero with truffle truffle init |
Các file được tạo ra
1 2 3 4 5 6 7 8 9 | . ├── contracts │ └── Migrations.sol ├── migrations │ └── 1_initial_migration.js ├── test ├── truffle-config.js └── truffle.js |
Viết contract
Trên thư mục contracts , chúng ta tạo file mới có tên Simplestore.sol có chức năng set một giá trị tham số cũng cho một thay đổi giá trị đó, hàm get chỉ đọc và một event có tên NewValueSet sẽ có giá trị tham số, như ví dụ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | pragma solidity <span class="token operator">^</span><span class="token number">0.4</span><span class="token number">.22</span><span class="token punctuation">;</span> contract SimpleStore <span class="token punctuation">{</span> uint value<span class="token punctuation">;</span> event <span class="token function">NewValueSet</span><span class="token punctuation">(</span>uint _value<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token keyword">set</span><span class="token punctuation">(</span>uint _value<span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token punctuation">{</span> value <span class="token operator">=</span> _value<span class="token punctuation">;</span> emit <span class="token function">NewValueSet</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">public</span> view <span class="token function">returns</span> <span class="token punctuation">(</span>uint<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> value<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Tiếp theo thêm 1 migration và tên tệp bắt đầu bằng số 2 ví dụ 2_simple_store.js và nội dung phải như sau:
1 2 3 4 5 6 | <span class="token keyword">var</span> SimpleStore <span class="token operator">=</span> artifacts<span class="token punctuation">.</span><span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"./SimpleStore.sol"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> module<span class="token punctuation">.</span><span class="token function-variable function">exports</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>deployer<span class="token punctuation">)</span> <span class="token punctuation">{</span> deployer<span class="token punctuation">.</span><span class="token function">deploy</span><span class="token punctuation">(</span>SimpleStore<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> |
Cài đặt và cấu hình Loom Truffle Provider
Công đoạn tiếp theo chúng ta cần cài loom-truffle-provider để cung cấp kết nối giữa Truffle và Loom DAppChain và cấu hình truffle-config.js
1 2 3 4 | npm install loom-truffle-provider --save #or yarn add loom-truffle-provider |
Trước khi cấu hình truffle-config.js chúng ta cần tạo key bằng lệnh :
loom genkey -a public_key -k private_key
Cấu hình truffle-config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">const</span> <span class="token punctuation">{</span> readFileSync <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'fs'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> LoomTruffleProvider <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'loom-truffle-provider'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> chainId <span class="token operator">=</span> <span class="token string">'default'</span> <span class="token keyword">const</span> writeUrl <span class="token operator">=</span> <span class="token string">'http://127.0.0.1:46658/rpc'</span> <span class="token keyword">const</span> readUrl <span class="token operator">=</span> <span class="token string">'http://127.0.0.1:46658/query'</span> <span class="token keyword">const</span> privateKey <span class="token operator">=</span> <span class="token function">readFileSync</span><span class="token punctuation">(</span><span class="token string">'./private_key'</span><span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> loomTruffleProvider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LoomTruffleProvider</span><span class="token punctuation">(</span>chainId<span class="token punctuation">,</span> writeUrl<span class="token punctuation">,</span> readUrl<span class="token punctuation">,</span> privateKey<span class="token punctuation">)</span> module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span> networks<span class="token punctuation">:</span> <span class="token punctuation">{</span> loom_dapp_chain<span class="token punctuation">:</span> <span class="token punctuation">{</span> provider<span class="token punctuation">:</span> loomTruffleProvider<span class="token punctuation">,</span> network_id<span class="token punctuation">:</span> <span class="token string">'*'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Running Truffle deploy command
Bây giờ bạn có thể deploy contract lên Dappchain được rồi nhưng hãy nhớ chạy mạng bằng lệnh ./loom run trước nhé :
truffle deploy --network loom_dapp_chain
Nếu bạn đã deploy và muốn deploy lại hãy dùng lệnh
truffle deploy --reset --network loom_dapp_chain
Cấu hình và chạy Web3.js + LoomProvider
Chúng ta đã deploy được contract lên mạng Dappchain rồi và tiếp theo chúng ta sẽ tương tác với contract đó thông qua web3.js và LoomProvider
Cài đặt web3.js
1 2 3 4 | npm install <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="87f0e2e5b4c7b6a9b7a9b7">[email protected]</a> --save #or yarn add <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="ddaab8bfee9decf3edf3ed">[email protected]</a> |
Cài đặt LoomProvider ( nó nằm trong loom-js)
1 2 3 4 | npm install loom-js --save #or yarn add loom-js |
Sau khi cài đặt xong chúng ta tạo một file js có tên index.js đùng để tương tác với Dappchain với nội dung như sau :
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <span class="token keyword">const</span> Web3 <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'web3'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> SimpleStore <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./build/contracts/SimpleStore.json'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> LoomProvider<span class="token punctuation">,</span> Client<span class="token punctuation">,</span> Contract<span class="token punctuation">,</span> Address<span class="token punctuation">,</span> LocalAddress<span class="token punctuation">,</span> CryptoUtils <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span><span class="token string">'loom-js'</span><span class="token punctuation">)</span> <span class="token keyword">const</span> privateKey <span class="token operator">=</span> CryptoUtils<span class="token punctuation">.</span><span class="token function">generatePrivateKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> publicKey <span class="token operator">=</span> CryptoUtils<span class="token punctuation">.</span><span class="token function">publicKeyFromPrivateKey</span><span class="token punctuation">(</span>privateKey<span class="token punctuation">)</span> <span class="token comment">// Create the client</span> <span class="token keyword">const</span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Client</span><span class="token punctuation">(</span> <span class="token string">'default'</span><span class="token punctuation">,</span> <span class="token string">'ws://127.0.0.1:46658/websocket'</span><span class="token punctuation">,</span> <span class="token string">'ws://127.0.0.1:46658/queryws'</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> main <span class="token operator">=</span> <span class="token keyword">async</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// The address for the caller of the function</span> <span class="token keyword">const</span> <span class="token keyword">from</span> <span class="token operator">=</span> LocalAddress<span class="token punctuation">.</span><span class="token function">fromPublicKey</span><span class="token punctuation">(</span>publicKey<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"from = "</span> <span class="token operator">+</span> <span class="token keyword">from</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Instantiate web3 client using LoomProvider</span> <span class="token keyword">const</span> web3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Web3</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LoomProvider</span><span class="token punctuation">(</span>client<span class="token punctuation">,</span> privateKey<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// const contractAddress = '0x62C436B6f3f028cF1eb14BDBBc0eaF0c63f62B0E'</span> <span class="token keyword">const</span> contractAddress <span class="token operator">=</span> SimpleStore<span class="token punctuation">.</span>networks<span class="token punctuation">[</span><span class="token string">"13654820909954"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>address<span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>contractAddress<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Instantiate the contract and let it ready to be used</span> <span class="token keyword">const</span> contract <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">web3<span class="token punctuation">.</span>eth<span class="token punctuation">.</span>Contract</span><span class="token punctuation">(</span>SimpleStore<span class="token punctuation">.</span>abi<span class="token punctuation">,</span> contractAddress<span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token keyword">from</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// Set the value 47</span> <span class="token keyword">await</span> contract<span class="token punctuation">.</span>methods<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token number">47</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token keyword">from</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// Get the value 47</span> <span class="token keyword">await</span> contract<span class="token punctuation">.</span>methods<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token keyword">from</span> <span class="token punctuation">:</span> <span class="token keyword">from</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">(</span>error<span class="token punctuation">,</span>result<span class="token punctuation">)</span><span class="token operator">=></span><span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"result = "</span> <span class="token operator">+</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> contract<span class="token punctuation">.</span>events<span class="token punctuation">.</span><span class="token function">NewValueSet</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>error<span class="token punctuation">,</span> event<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'New value set = '</span><span class="token punctuation">,</span> event<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span>console<span class="token punctuation">.</span>error<span class="token punctuation">)</span><span class="token comment">// The address for the caller of the function</span> <span class="token punctuation">}</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Để chạy file này bạn có thể chạy bằng lệnh :
node index.js
github ví dụ hoàn chỉnh :
https://github.com/vinhyenvodoi98/Loomnetwork_Dappchain
Các nguồn tham khảo :
https://loomx.io/developers/docs/en/intro-loom-sdk.html
Bài giới thiệu về Loom Network cũng như xây dựng một ví dụ đơn giản chạy trên Loom Network đến đây là kết thúc rất mọng mọi người có thể để lại ý kiến dưới phần comment bên dưới