Truffle Solidity là gì

Như các bạn đã biết thì cuối năm vừa rồi và đầu năm nay thì BTC , ETH và các altcoins lên giá chóng mặt. Và rồi sau đó rớt phải nói là sấp mờ lờ

.

Và mình cũng không phải là ngoại lệ nhưng trading hay holding chỉ là phụ việc chính vẫn là coding

. Blockchain nói chung và smart contract nói riêng đã và luôn là một thứ luôn hot. Mình cũng không nằm ngoài xu thế đó. Làm thể nào để tiếp cận với blockchain? Mình có background là Ruby nên mình quyết định chọn javascript cũng như nodejs để tiếp cận với Smart Contract [SC]
. Ở bài viết này mình chỉ xin chia sẽ lại các bạn các bước mình tìm hiểu viết và deploy một SC đơn giản mà thôi.

Trước tiên các bạn cần phải hiểu một số khái niệm cơ bản:

Để viết một SC ta cần phải hiểu thêm một số khái niệm nữa:

1. Viết Smart Contract

1.1 Cài đặt môi trường development

  • Phải chắc chắn rằng đã cài đặt node trên máy [ở đây là macOS] hoặc có thể cái đặt theo hướng dẫn tại đây: //blog.teamtreehouse.com/install-node-js-npm-mac.

  • Cài đặt Truffle. Đây là một framework để phát triển Ethereum Smart Contract : //github.com/trufflesuite/truffle . Nó giúp xây dựng cấu trúc và một số lệnh để viết SC. Chạy lệnh: npm install -g truffle.

  • Cài đặt một local blockchain với Ganache.
    Ganache sẽ cho 10 địa chỉ ETH ảo để test . Các bạn cũng lưu ý URL máy chủ RPC như trong hình:

1.2 Bắt đầu viết SC

Tạo một thư mục để viết SC của bạn ở đây mình đặt là first_contract. mkdir first_contract và cd first_contract . Sau đó chạy lệnh: truffle init. Ta có được một cấu trúc project như sau:

  • Thư mục contracts là nơi chứa các hợp đồng thông minh của bạn.

  • Thư mục migrations sẽ nơi bạn sẽ viết các đoạn script để deploy hợp đồng thông minh.

  • Thư mục test là nơi chứa các đoạn script để kiểm tra tính đúng đắn của hợp đồng thông minh.

  • SC thì được viết bằng Solidity. Đọc thêm: //solidity.readthedocs.io/en/v0.4.24

Ở đây tôi viết một SC đơn giản contracts/Fcontracts.sol :

pragma solidity ^0.4.24; contract Fcontracts { mapping [address => uint] fcontracts; function updateFcontracts[uint fcontract] public { fcontracts[msg.sender] = getFcontracts[msg.sender] + fcontract; } function getFcontracts[address addr] public view returns[uint] { return fcontracts[addr]; } }

Giải thích:

pragma solidity ^0.4.24;

Chúng ta sử dụng solidity version 0.4.24 để viết SC.

contract Fcontracts

Mọi thứ liên quan đến Fcontracts đều nằm trong hợp đồng này. Về cơ bản một SC là tập hợp các chức năng và trạng thái [mã và dữ liệu] tại một địa chỉ trong Ethereum blockchain.

mapping [address => uint] fcontracts;

Trong Solidity, một ánh xạ được gọi là một bảng băm, bao gồm các loại khóa và cặp kiểu giá trị.
Ở đây, chúng ta tạo một ánh xạ, nó chấp nhận kiểu khóa đầu tiên [trong trường hợp của chúng ta, nó sẽ là một kiểu địa chỉ], và kiểu giá trị sẽ là unit.

function updateFcontracts[uint fcontract] public { fcontracts[msg.sender] = getFcontracts[msg.sender] + fcontract; } function getFcontracts[address addr] public view returns[uint] { return fcontracts[addr]; }

Ở SC này có 2 public methods: gettersetter. Thật dễ hiểu phải không nào

.

Sau khi viết xong SC, ta cần viết thêm test để kiểm tra nó hoạt động . Tạo test/FconFcontracts.js. Chúng ta sẽ viết test bằng Mocha testing framework:

// web3 is a global variable, injected by Truffle.js const BigNumber = web3.BigNumber // artifacts is a global variable, injected by Truffle.js const Fcontracts = artifacts.require["./Fcontracts.sol"] require['chai'] .use[require['chai-as-promised']] .use[require['chai-bignumber'][BigNumber]] .should[] contract['Fcontracts', function[walletAddresses] { let me = walletAddresses[0] let contract beforeEach[async function [] { contract = await Fcontracts.new[] }] it['should create contract', async function [] { contract.should.exist const fcontracts = await contract.getFcontracts[me] fcontracts.should.be.bignumber.equal[new BigNumber[0]] }] it['should updateFcontracts and getFcontracts correctly', async function [] { // initially i have 0 shares let fcontracts = await contract.getFcontracts[me] fcontracts.should.be.bignumber.equal[new BigNumber[0]] await contract.updateFcontracts[1, { from: me }] fcontracts = await contract.getFcontracts[me] fcontracts.should.be.bignumber.equal[new BigNumber[1]] }] }]

Ở đây tôi viết test có 2 phương thức getFcontractsupdateFcontracts. Chạy truffle test để chắn chắc test passed.

Sau khi chắc chắn mọi thứ đã ổn ta cần deploy SC này lên testnet. Ở đây là môi trường development.

1.3 Deploy SC lên local blockchain

Chúng ta cần phải mở app Ganache lên trươc tiên sau đó cài đặt cấu hình truffle để deploy local blockchain.

Như các bạn đã thấy trong thư mục project của chúng ta có 2 file: truffle.jstruffle-config.js . Vì mình sử dụng mac nên mình sẽ xoá đi file truffle-config.js. Sau đó sửa lại như sau:

module.exports = { networks: { development: { host: 'localhost', port: 7545, network_id: '*' // Match any network id } } }

7545 chính là port của Ganache RPC .

À khoan để deploy SC ta cần phải viết thêm deploy migration. Ta tạo thêm 1 file: migrations/2_deploy_contracts.js với nội dung:

var Fcontracts = artifacts.require['Fcontracts'] module.exports = function [deployer, network, accounts] { deployer.deploy[Fcontracts] }

Chúng ta sẽ chạy lệnh để deploy SC:

truffle migrate --network development

Đây là màn hình console khi deploy:

Khi deploy thành công chúng ta sẽ có các transactions:

Transaction được khoanh đỏ trong hình chính là transaction khi chúng ta deploy SC. Sau khi deploy xong thì chúng ta sẽ bị trừ đi một số ETH cái này gọi là fee. Cái fee này được trả cho toàn mạng. Giao dịch khởi tạo cho hợp đồng này có thể gọi là mắc

Như vậy các bạn đã tạo được một Smart Contract và deploy nó lên local blockchain cực kì đơn giản phải không. Ở phần 2 mình sẽ hướng dẫn các bạn deploy lên các Testnet thật. Toàn bộ source code mình sẽ để lại trong phần 2 nhé. Happy Coding

Cùng một tác giả

39 6

Nếu bạn muốn xây dựng một website mà chỉ bao gồm HTML, CSS và Javascript. Bạn có thể xây dựng 1 static web hoàn toàn miễn phí phục vụ cho việc học ...

9 0

Nội dung của bài viết này có thể đã có rất nhiều người đã biết, nhưng mình cũng xin được chia sẽ lại cho những ai chưa biết. Hoàn Cảnh Data cons...

8 7

Kiểm tra url có tồn tại hay không ? Ngôn ngữ Ruby ruby require 'net/http' require 'openuri' def working_url?[url_str] url = URI.parse[ur...

Bài viết liên quan

11 5

1 0

Webpack Webpack là một module loader khá phổ biến trong phát triển web phía front end. Trong project xây dựng DApps trên Ethereum, ta hoàn toàn co...

Video liên quan

Chủ Đề