Phát triển các ứng dụng Blockchain bằng công nghệ Sidechain – Phần 2


  • administrators

    Phát triển các ứng dụng Blockchain bằng công nghệ Sidechain – Phần 2

    alt text

    Phần 1 – Thiết Lập blockchain
    Phần 2 – Tạo Sidechain đầu tiên của bạn
    Phần 3 – Tạo Frontend cho Dapp Sidechain (Coming soon)
    Phần 4 – Hiểu về Blockchain và kiến trúc Sidechain (Coming soon)
    Phần 5 – Phát hành token của riêng bạn (Coming soon)

    Ở Phần 1, chúng ta đã học cách cài đặt Blockchain ASCH.
    Trong phần này, chúng ta sẽ tạo sidechain riêng biệt của mỗi người. Điều chúng ta cần là một sidechain có lịch sử các block của riêng nó và cấu trúc dữ liệu có thể chấp nhận được.

    Bạn có thể tải về mã code cho hướng dẫn này ở dạng file .zip hoặc xem nó trên Github.

    Mainchain ASCH

    Hình ảnh sau đây mô tả main chain (chuỗi chính) ASCH. Mainchain này là một mạng lưới gồm các node, rất giống với một cơ sở dữ liệu phân tán. Vì vậy, một blockchain có thể ‘giao tiếp’.

    alt text

    Công nghệ Sidechain ASCH

    Mỗi sidechain cũng là một blockchain, hoạt động một cách riêng biệt với các node của nó. Sidechain có thể tương tác với mainchain.

    Hình ảnh dưới đây mô tả mối quan hệ giữa mainchain và các sidechain.

    alt text

    Lợi ích của sidechain

    Để hiểu hơn về công nghệ sidechain, hãy lấy Ethereum, nền tảng không sử dụng công nghệ sidechain, làm ví dụ. Mỗi giao dịch trên mạng lưới Ethereum được ghi lại trên tất cả các node blockchain, được xác minh bởi các miner. Năm 2017, CryptoKitties, một ứng dụng phi tập trung (game) trên Ethereum, đã tạo ra rất nhiều lưu lượng trên mạng Ethereum và gây ra sự tắc nghẽn cho toàn bộ mạng. (Nguồn: BBC). Tuy nhiên, sự cố CryptoKitties sẽ không xảy ra nếu dùng công nghệ sidechain.

    Với công nghệ sidechain, Dapp như CrytoKitties có thể chạy trên sidechain – một blockchain riêng biệt. Sidechain này xử lý tất cả giao dịch bao gồm mua bán, sản sinh và tạo ra CryptoKitties. Vì thế, trò chơi sẽ không làm tắc nghẽn mạng blockchain chính nữa.

    Sidechain vs Thuật ngữ Dapp

    Ở Blockchain ASCH, chúng ta có thể sử dụng từ ‘Sidechain’ và từ ‘Dapp’ (Ứng dụng phi tập trung) để thay thế cho nhau. Từ ‘Sidechain’ mô tả một mạng lưới các node giao tiếp với main chain và những node này làm việc cho một Ứng dụng phi tập trung (Dapp). Chúng ta gọi nó là phi tập trung bởi vì ứng dụng này được chạy bởi một nhóm các node phân tán.

    Ghi chú:
    Sidechain = Dapp
    Hai từ khóa này hoàn toàn giống nhau trên Blockchain ASCH.

    Thiết lập quá trình phát triển

    Vì mục đích phát triển, chúng ta làm mọi thứ dễ dàng hơn và chỉ sử dụng một node duy nhất cho main chain và một node duy nhất cho sidechain của chúng ta, cả hai đều chạy cục bộ trên máy tính.
    Cách thiết lập của chúng ta sẽ như sau:
    Main chain nằm trong thư mục asch, Sidechain nằm trong thư mục sidechain.

    alt text

    Cấu trúc Thư mục

    Đầu tiên, chúng ta phải thiết lập cấu trúc thư mục cho sidechain của mình. Main chain để ở thư mục asch ( mà chúng ta đã cài đặt ở Phần 1). Bây giờ chúng ta sẽ xây dựng blockchain của riêng mình, một sidechain hoạt động riêng và giao tiếp với blockchain chính.

    Tạo cấu trúc thư mục như sau:

    alt text

    # create sidechain directory
    mkdir sidechain

    # change directory
    cd sidechain
    # create directories
    mkdir contract interface model public

    Những file mới

    Tạo cấu trúc file như sau:

    alt text

    model/article.js

    Trong đường dẫn model, tạo một file mới model/article.js. Dán nội dung này vào trong nó.

    // file-name: model/article.js

    module.exports = {
    name: 'articles',
    fields: [
    {
    name: 'id',
    type: 'String',
    length: '20',
    not_null: true,
    primary_key: true
    },
    {
    name: 'tid',
    type: 'String',
    length: 64,
    not_null: true,
    unique: true
    },
    {
    name: 'authorId',
    type: 'String',
    length: 50,
    not_null: true
    },
    {
    name: 'title',
    type: 'String',
    length: 256,
    not_null: true
    },
    {
    name: 'text',
    type: 'String',
    length: 4096,
    not_null: true,
    },
    {
    name: 'votes',
    type: 'Number',
    not_null: true
    },
    {
    name: 'timestamp',
    type: 'Number',
    not_null: true
    }
    ]
    }

    Câu lệnh này sẽ tạo một bảng articles mới trong Cơ sở dữ liệu SQL sidechain của chúng ta.

    Bảng này sẽ được dùng để lưu những bài viết mới. Chúng ta sẽ thảo luận nhiều hơn về chủ đề này sau.

    alt text

    Trong đường dẫn contract, tạo một file mới contract/article.js. Dán nội dung này vào trong đó. Sau đó chúng ta sẽ đăng nhập vào contract này.

    *// file-name: contract/article.js

    module.exports = {
    createArticle: async function (title, text) {
    if (!title) {
    return 'no_title: Should provide title1'
    }
    if (!text) {
    return 'no_text: Should provide text'
    }
    if (title.length > 256) {
    return 'title_too_long: Title should not be longer than 256 characters'
    }
    if (text.length > 4096) {
    return 'text_too_long: Text should not be longer than 4096 characters'
    }

    let exists = await app.model.Article.exists({ title: title })
    if (exists) {
      return `title_already_in_use: Title "${title}" already in use`
    }
    
    app.sdb.create('Article', {
      id: app.autoID.increment('article_max_id'),
      tid: this.trs.id,
      authorId: this.trs.senderId,
      title: title,
      text: text,
      votes: 0,
      timestamp: this.trs.timestamp
    })
    

    }
    }*

    init.js

    Lúc này mở init.js trong trình soạn thảo văn bản yêu thích của bạn và dán nội dung sau.

    *// file-name: init.js

    module.exports = async function () {
    app.logger.info('enter dapp init')

    // register createArticle smart contract
    app.registerContract(1000, 'article.createArticle')
    // set fee for createArticle to 1 XAS
    app.registerFee(1000, '100000000', 'XAS')
    }*

    Với lệnh app.registerContract, chúng ta đăng ký hàm contract createArticle làm contract 1000. Con số 1000 thật ra không có ý nghĩa gì đặc biệt cả. Nếu sau đó chúng ta muốn tham khảo contract này trong mã code, chỉ cần gọi lệnh 1000.

    Chúng tôi đưa ra mức phí để tạo một bài viết mới là 1 XAS. XAS có 8 chữ số thập phân. Vì thế được viết là ‘100000000’ thay vì là ‘1’.

    Tài liệu chi tiết về cách đăng ký các hợp đồng (contract): Register Contract

    interface/article.js

    Để truy cập vào các bài viết mới, chúng ta cần thêm một REST-Endpoint công khai vào blockchain của chúng ta.

    Endpoint: http://localhost:4096/api/dapps/<dappId>/articles
    HTTP Verb: GET
    Returns: JSON

    Thêm một file mới article.js vào trong giao diện đường dẫn.

    /*/ file-name: interface/article.js

    app.route.get('/articles', async (req) => {

    // load all articles
    let articles = await app.model.Article.findAll({
    limit: 50,
    offset: 0,
    sort: { timestamp: -1 }
    })
    return articles
    })*

    dapp.json

    Tạo một file mới dapp.json

    {
    "name": "test",
    "link": "https://test.zip",
    "category": 1,
    "description": "A hello world demo for asch dapp",
    "tags": "asch,dapp,demo",
    "icon": "http://o7dyh3w0x.bkt.clouddn.com/hello.png",
    "type": 0,
    "delegates": [
    "db18d5799944030f76b6ce0879b1ca4b0c2c1cee51f53ce9b43f78259950c2fd",
    "590e28d2964b0aa4d7c7b98faee4676d467606c6761f7f41f99c52bb4813b5e4",
    "bfe511158d674c3a1e21111223a49770bee93611d998e88a5d2ea3145de2b68b",
    "7bbf62931cf3c596591a580212631aff51d6bc0577c54769953caadb23f6ab00",
    "452df9213aedb3b9fed6db3e2ea9f49d3db226e2dac01828bc3dcd73b7a953b4"
    ],
    "unlockDelegates": 3
    }

    genesis.json

    Tạo một file mới genesis.json.Đây là block genesis cho sidechain của chúng ta. Block genesis là block đầu tiên trên Sidechain.

    {
    "delegate": "a7cfd49d25ce247568d39b17fca221d9b2ff8402a9f6eb6346d2291a5c81374c",
    "height": 1,
    "pointId": null,
    "pointHeight": null,
    "transactions": [],
    "timestamp": 0,
    "payloadLength": 0,
    "payloadHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "count": 0,
    "signature": "287818ef81b51375cc1cc36b62e3f3b8027d8334633828fee0801d9033a0da60a9ca182ac4435c663aabae141563c06c6cd55d494bce1d2dae92e9da8ace0205",
    "id": "cee2f87f98d0344646ae726af4df3bb1bddcceecc64053f36d16d1281aa90215"
    }

    config.json

    Tạo một file mới config.json. Với file này, chúng ta có thể có 5 tài khoản khác nhau để tạo (forge) Sidechain của mình. Đó là một quá trình tạo ra những block mới và xác minh giao dịch. Forge rất giống với mining trên mạng Ethereum.

    {
    "peers": [],
    "secrets": [
    "flame bottom dragon rely endorse garage supply urge turtle team demand put",
    "thrive veteran child enforce puzzle buzz valley crew genuine basket start top",
    "black tool gift useless bring nothing huge vendor asset mix chimney weird",
    "ribbon crumble loud chief turn maid neglect move day churn share fabric",
    "scan prevent agent close human pair aerobic sad forest wave toe dust"
    ]
    }

    public/index.html

    Tạo một file html trống trong thư mục công khai.

    touch public/index.html

    Lúc này chúng ta sẽ có cấu trúc file mới như sau.

    alt text

    Tạo các bài viết với các lệnh REST.

    Ứng dụng phi tập trung của chúng ta đã sẵn sàng để tạo ra một số bài viết.
    Trong phần này của loạt bài viết, chúng ta chỉ tạo các bài viết thông qua các yêu cầu HTTP node.js. Chỉ dành cho mục đích minh họa.

    Trong phần 3, chúng ta sẽ xây dựng một GUI Vue.js xung quanh hệ thống backend DApp của chúng ta.

    Cấu trúc thư mục của chúng ta sẽ như thế này:

    alt text

    Tạo một thư mục mới api_access trong đường dẫn sidechain

    mkdir api_access

    Thay đổi đường dẫn thành api_access

    cd api_access

    Tạo một file package.json bằng lệnh sau

    npm init --yes

    Cài đặt tất cả các phụ thuộc cần thiết:

    npm install asch-js axios commander --save

    Tạo file index.js mới cho api access.

    *// file-name api_access/index.js
    const axios = require('axios')
    const aschJS = require('asch-js')
    const program = require('commander')
    let dappId = '4a5e158db7248d5e8b0eb503d048320bbf21a935a74d63e5f98f578bd8fb2d2b'
    let mySecret = 'sentence weasel match weather apple onion release keen lens deal fruit matrix'
    let post = (title, text) => {
    console.log('post')
    const signedTransactionsUrl = http://localhost:4096/api/dapps/${dappId}/transactions/signed
    let option = {
    fee: '100000000',
    type: 1000,
    args: JSON.stringify([title, text])
    }
    // sign transaction
    let transaction = aschJS.dapp.createInnerTransaction(option, mySecret)
    let data = {
    transaction: transaction
    }
    let headers = {
    headers: {
    'magic': '594fe0f3', 'version': ''
    }
    }
    // send signed transaction to Sidechain
    return axios.put(signedTransactionsUrl, data, headers)
    .then((result) => {
    console.log('result:')
    console.log(JSON.stringify(result.data, null, 2))
    })
    .catch((error) => {
    console.log('Be sure to have the right "<dapp Id>" set!')
    console.error(error.message)
    })
    }
    let get = (id) => {
    const url = http://localhost:4096/api/dapps/${dappId}/articles
    return axios.get(url)
    .then((result) => {
    console.log(JSON.stringify(result.data, null, 2))
    })
    .catch((error) => {
    console.log('Be sure to have the right "<dapp Id>" set!')
    console.error(error.message)
    })
    }
    program
    .command('postArticle [title] [content]')
    .action(function (title, content) {
    post(title, content)
    .then(() => {
    })
    })

    program
    .command('getArticle [id]')
    .action(function (id) {
    get(id)
    .then(() => {
    })
    })
    program.on('--help', function () {
    console.log('')
    console.log(' Examples:')
    console.log(' postArticle "hello" "my first article"')
    console.log(' getArticle 2')
    console.log('')
    })
    if (!process.argv.slice(2).length) {
    program.outputHelp()
    }
    program.parse(process.argv)*

    Cảnh báo:

    Đảm bảo đặt đúng <dapp Id> trong index.js sau khi Dapp được đăng ký (đừng lo, chúng ta sẽ đăng ký nó trong bước tiếp theo)

    Cài đặt công cụ cần thiết

    Với công cụ asch-redeploy, chúng ta có thể liên tục đăng ký và cài đặt DApp của mình vào blockchain cục bộ mỗi khi một file thay đổi.

    npm install --global asch-redeploy

    Đăng ký Dapp

    Asch-redeploy đã được cài đặt. Bây giờ chúng ta có thể sử dụng nó để đăng ký Dapp của mình trên blockchain cục bộ.

    Kiểm tra bạn có đặt vào thư mục sidechain:

    *pwd

    output

    /home/sidechain*

    Khởi động

    Chạy asch-redeploy để xem các thay đổi file trên Dapp của bạn.

    asch-redeploy

    alt text

    Asch-redeploy sẽ tự động đăng ký Dapp mới của bạn trên mainchain.
    Quá trình này có thể tốn vài giây. Bạn sẽ thấy dappId sau khi đăng ký. Đây là thứ định danh duy nhất cho Dapp của bạn.

    alt text

    DappID

    <dapp Id> mới cho Dapp của tôi là 59d24769645a04b2a759d61d874cde3a5033eacab00cdedce77d4f21a8ea9bce (của bạn sẽ khác của tôi)

    Chỉnh sửa file api_access/index.js

    <dapp Id> mới của bạn nên được dán vào api_access/index.js
    const axios = require('axios')
    const aschJS = require('asch-js')
    const program = require('commander')
    // paste your unique dappId here
    let dappId = 'paste <dapp Id> here'

    Thay đổi đường dẫn

    Đảm bảo chắc chắn rằng bạn khởi động một cửa số terminal mới và thay đổi đường dẫn thành api_access.

    Ở cửa sổ terminal khác cũng sẽ tiếp tục chạy quá trình asch-redeploy của bạn:

    cd api_access

    alt text

    Tạo bài viết mới

    Bây giờ hãy thực hiện lệnh sau để thêm một bài viết mới vào Dapp bằng cửa số terminal mới:

    *node index.js postArticle "My Title" "My Content"

    return message from the Sidechain (Dapp)

    {
    "transactionId": "ad83258e73679d15a539f774f9f003b416d00817dab2232bbc17cec9adea69bd",
    "success": true
    }*

    Xem bài viết

    Để xem các bài viết đã được lưu trên DApp, hãy thực hiện đoạn mã sau trong cửa sổ terminal mới:

    node index.js getArticle
    # return message from the Dapp
    [
    {
    "id": "1",
    "tid": "ad83258e73679d15a539f774f9f003b416d00817dab2232bbc17cec9adea69bd",
    "authorId": "AHMCKebuL2nRYDgszf9J2KjVZzAw95WUyB",
    "title": "Title",
    "text": "Content",
    "votes": 0,
    "timestamp": 62705044,
    "t_timestamp": 62705044,
    "t_type": 1000,
    "t_height": 99
    }
    ]

    Bài viết đã lưu

    Ở đây bạn có thể xem các bài viết mới được lưu mà chúng tôi đã tạo thông qua các lệnh REST API của chúng tôi? Đây là một bảng SQL của Dapp của chúng tôi. Chúng tôi đã chấp nhận cơ sở dữ liệu SQL sidechain theo nhu cầu của chúng ta và thêm bảng articles cho dữ liệu.

    alt text

    Sidechain không tùy chỉnh

    Nếu không có tuỳ chỉnh, lược đồ cơ sở dữ liệu SQL sidechain sẽ trông giống như thế này:

    alt text

    Sidechain tùy chỉnh

    Sau khi bổ sung bảng articles, cơ sở dữ liệu SQL sidechain của chúng ta trông giống như sau:

    alt text

    Kết luận

    Chúng ta đã xây dựng ứng dụng phi tập trung (DApp) rất đơn giản đầu tiên cho chúng ta trong hướng dẫn này.

    Ở phần 3, chúng ta sẽ xây dựng một GUI trong Vue.js cho Dapp đơn giản của chúng ta.

    Nhiệm vụ

    Nhiệm vụ của bạn là hoàn thành việc bình chọn (upvoting) cho các bài viết. Hãy chắc chắn đã đăng ký một hợp đồng (contract) mới.

    Tải về

    Tải về mã code cho hướng dẫn này ở dạng file .zip hoặc xem nó trên Github

    Tìm hiểu thêm

    Câu hỏi

    Nếu bạn có bất kỳ câu hỏi nào, hãy đặt câu hỏi trên gitter-chat gitter.im/asch-development

    Tài liệu

    Nếu bạn muốn tìm hiểu sâu hơn về việc phát triển Dapp của riêng mình, bạn có thể đọc các tài liệu dưới đây:

    Sidechain Javascript SDK
    Sidechain Rest API

    Các Dapp mẫu

    1. CCTime

    • Sidechain Frontend
    • Sidechain Backend

    2. Hello-World

    • Sidechain Frontend and Backend

    Tìm hiểu thêm về ASCH:

    Website: https://www.asch.io/
    Github: https://github.com/AschPlatform
    Telegram: https://t.me/aschEnglish
    Twitter: https://twitter.com/Asch_io
    ASCH BBS: https://bbs.asch.io/
    Facebook: https://www.facebook.com/AschHQ/
    Reddit: https://www.reddit.com/r/Asch_Platform/
    Gitter Chatroom: https://gitter.im/asch-development

    THAM GIA CỘNG ĐỒNG CỘNG TÁC VIÊN CHÚNG TÔI!

    alt text


  • administrators

    @danynguyen Riêng chứ, sidechain nào cũng tương tác được với mainchain hết. Thường thì có 1 số cách implement sidechain ví dụ như tạo ra vô vàn sidechain và chỉ cần dùng 1 main chain dùng công nghệ merkle tree hoặc 1 main chain với 1 số side chain và mỗi side chain sẽ xử lý 1 lượng nhất định contracts chẳng hạn.



  • ASCH thì main chain với side chain là giống nhau à Bob?
    Nếu thế cùng lúc xử lý contracts thế nào?


Log in to reply
 

Looks like your connection to Asch was lost, please wait while we try to reconnect.