Trang chủ Tạp chí Lập trình smart contracts: Phần 2 Viết smart contracts đầu tiên

Lập trình smart contracts: Phần 2 Viết smart contracts đầu tiên

Mở đầu

Smart contracts sinh ra nhằm mục đích giải quyết bài toán tin tưởng trong một môi trường thiếu tin tưởng như Internet. Và smart contract không phải là điều gì quá ghê gớm, nó sinh ra để giải quyết các bài toán thực tế, chẳng hạn như: trả lương, bảo hiểm, thừa kế, trao đổi, mua bán…. Gần đây chúng ta nghe nhiều về Decentralized Exchange, ICO… mọi người nói về nó thực sự rất ghê gớm. Đôi khi người ta thổi phồng sự việc lên một cách không cần thiết nhằm đạt mục đích PR. Nhưng trong kỹ thuật mọi thứ đều tiệm cận tới θ.

Token ERC20 

Trong hệ thống của Ethereum thì ETH đóng vai trò là native token, phí giao dịch sẽ được tính trên token này. Ethereum platform còn cho phép người dùng định nghĩa token riêng và để chuẩn hóa các token này, ERC20 ra đời. Tùy mục đích của người sáng lập mà một ecosystem có thể có hoặc không có token.

Viết một token đơn giản

Một token đơn giản nhất sẽ bao gồm các thành phần sau:

  • totalSupply: Tổng số token
  • balanceOf(): Hiển thị balance của một owner
  • transfer(): Chuyển token từ người sở hữu này sang cho người khác

Đầu tiên ta phải định nghĩa một mapping để lưu trữ thông tin của token đóng vai trò như một ledger:

mapping (address => uint256) balances;

Với mỗi address sẽ mapping tới một số uint256 (unsigned integer 256 bits). Ta có thể tương tác thông qua toán tử [] để access các phần tử.

Tiếp theo để đọc dữ liệu từ mapping ta tạo ra method balanceOf():

function balanceOf(address _owner) constant public returns(uint256){
return balances[_owner];
}

Method này cho phép ta đọc thông tin của bất cứ owner nào và biết họ có bao nhiêu token.

Ta định nghĩa method transfer() để có thể chuyển đổi token giữa các owner

function transfer(address _to, uint256 _value) public returns(bool){
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}

Và kết hợp tất cả ta có smart contract của AmazingToken

pragma solidity ^0.4.11;contract AmazingToken{

uint256 public totalSupply;

mapping (address => uint256) balances;

function balanceOf(address _owner)
constant public returns(uint256){
return balances[_owner];
}

function transfer(address _to, uint256 _value)
public returns(bool){
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}

}

Bảo mật cho AmazingToken:

Trong smart contract nói trên ta sẽ thấy các vấn đề của method transfer() đó là:

  • Nếu _to = 0x00 thì token sẽ biến mất, giống như ta stream data vào /dev/nullvậy
  • Transfer vẫn thực thi cho dù senderkhông có đủ balance

Giờ ta viết lại smart contract của AmazingToken kèm theo việc check các conditions này.

pragma solidity ^0.4.11;contract AmazingToken{

uint256 public totalSupply;

mapping (address => uint256) balances;

modifier onlyValidAddress(address _to){
require(_to != address(0x00));
_;
}

modifier onlyValidValue(address _from,uint256 _value){
require(_value <= balances[_from]);
_;
}

function balanceOf(address _owner)
constant public returns(uint256){
return balances[_owner];
}

function transfer(address _to, uint256 _value)
onlyValidAddress(_to) onlyValidValue(msg.sender,_value)
public returns(bool){
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}

}

Việc thêm hai modifier này làm cho contract của chúng ta an toàn hơn rất nhiều. Sau khi lập trình xong token thì điều mọi người nghĩ tới cách thức để phát hành token.

Định nghĩa phương thức phát hành token

Ta định nghĩa method nhằm bán AmazingToken mỗi khi có ai đó gửi Ethereum tới sẽ nhận lại AmazingToken theo tỉ lệ 1:100.

function () public payable {
uint256 _issued = (msg.value*100)/10**18;
totalSupply += _issued;
balances[msg.sender] = _issued;
}

Biến global msg.value chứa giá trị eth theo đơn vị wei (1 eth = 10¹ wei).

Smart contract của AmazingToken sẽ như sau

pragma solidity ^0.4.11;contract AmazingToken{

uint256 public totalSupply;

mapping (address => uint256) balances;

modifier onlyValidAddress(address _to){
require(_to != address(0x00));
_;
}

modifier onlyValidValue(address _from,uint256 _value){
require(_value <= balances[_from]);
_;
}

function () public payable {
uint256 _issued = (msg.value*100)/10**18;
totalSupply += _issued;
balances[msg.sender] = _issued;
}

function balanceOf(address _owner) constant public
returns(uint256){
return balances[_owner];
}

function transfer(address _to, uint256 _value)
onlyValidAddress(_to) onlyValidValue(msg.sender,_value) public
returns(bool){
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}

}

Decentralized exchange

Bây giờ mình sẽ viết một smart contract đóng vai trò như một Decentralized Exchange, điều mình mong muốn là có thể rao bán AmazingToken mà mình đang sở hữu nếu có ai đó chấp nhận mua nó bằng Ethereum.

pragma solidity ^0.4.11;contract AmazingTokenInterface{
uint256 public totalSupply;
function () public payable;
function balanceOf(address _owner)
constant public returns(uint256);
function transfer(address _to, uint256 _value)
public returns(bool);
}contract AmazingDex {    AmazingTokenInterface AmazingToken;    address ChiroWallet = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;

uint256 public rate = 100;    modifier onlyValidAddress(address _to){
require(_to != address(0x00));
_;
}

modifier onlyChiro(){
require(msg.sender == ChiroWallet);
_;
}

function setRate(uint256 _rate)
onlyChiro public returns(uint256){
rate = _rate;
return rate;
}

function AmazingDex(address _amazingTokenAddress)
onlyValidAddress(_amazingTokenAddress) public {
AmazingToken = AmazingTokenInterface(_amazingTokenAddress);
}    function buyToken()
onlyValidAddress(msg.sender) public payable {
uint256 _value = (msg.value*rate)/10**18;
assert(AmazingToken.transfer(msg.sender, _value));
ChiroWallet.transfer(msg.value);
}
}

Smart contract này thực hiện một điều rất đơn giản, khi có bất kỳ ai gọi method buyToken() thì mình sẽ trả token cho họ theo như rate đã được mình cung cấp, còn Ethereum sẽ ngay lập tức về ví của mình.

Tất nhiên AmazingToken sẽ do AmazingDex contract này nắm giữ.

Dislaimer: Đây là thông tin cung cấp dưới dạng blog cá nhân, không phải thông tin tổng hợp hay lời khuyên đầu tư. Chúng tôi không chịu trách nhiệm về các quyết định đầu tư của bạn.

MỚI CẬP NHẬT

Cardano (ADA) sẽ giảm 74% hay tăng 75% lên 1 USD?

Nhà phân tích Credible Crypto đang bày tỏ tâm lý giảm giá đối với Cardano (ADA). Theo anh, Cardano phải đối mặt với nguy...

[QC] Tính năng đòn bẩy gấp 1.000 lần của DTX Exchange gây chú ý,...

Trong thị trường tiền điện tử, nơi mà sự đổi mới và các tính năng táo bạo thường quyết định sự thành công,...

Tin vắn Crypto 20/04: Bitcoin có thể chạm mốc 10 triệu USD trong dài...

Từ nhận định Bitcoin có thể tăng lên 10 triệu USD đến Hoa Kỳ thúc đẩy quan hệ đối tác AI với Nigeria để...
bitcoin

Cá voi và thợ đào Bitcoin đang nắm giữ bao nhiêu lợi nhuận?

Dựa trên dữ liệu on-chain, bài viết sẽ cho bạn biết cá voi và thợ đào Bitcoin đang nắm giữ bao nhiêu lợi nhuận...

ID, CTSI và YGG: Hơn 30 triệu đô la token sẽ được mở khóa...

Tuần bắt đầu từ ngày 22/4 không có nhiều sự kiện mở khóa quan trọng được lên lịch, nổi bật nhất trong đó phải...

[QC] Một Phần Chó, Một Phần AI, Một Phần Xúc Xích: WienerAI Dẫn Đầu...

WienerAI ($WAI) là dự án tiền điện tử mới nhất đang khơi dậy cơn sốt meme coin, trong bối cảnh thị trường tiền...
EigenLayer

Các nhà vận hành EigenLayer đang thua lỗ nhưng tại sao họ vẫn đăng...

Khi EigenLayer, giao thức DeFi lớn thứ hai trên blockchain Ethereum, ra mắt nghiêm túc vào ngày 9/4, một tính năng chính đã bị...

Các chuyên gia trong ngành lạc quan về altcoin sau halving Bitcoin

Thị trường tiền điện tử, đặc biệt là Bitcoin, trải qua giai đoạn biến đổi 4 năm một lần được gọi là “halving”, trong...

[Quảng Cáo] Các nhà đầu tư của Algotech (ALGT) vui mừng trước tiềm năng...

Các nhà đầu tư tiền điện tử rất hào hứng với một tân binh tiền điện tử, Algotech (ALGT), hứa hẹn mang lại...
tiền điện tử

Nickel Digital: Kỷ lục biến động của tiền điện tử vào quý 1 “không...

Công ty quản lý tài sản kỹ thuật số Niken đã cảnh báo các nhà đầu tư không nên mong đợi lặp lại hiệu...
bitcoin

CIO Bitwise tin rằng thị trường chưa định giá nhu cầu về Bitcoin sau...

CIO Matt Hougan của Bitwise đặt ra nghi ngờ về việc liệu giá hiện tại có thực sự nắm bắt được tác động tiềm...

[QC] Chương trình presale mới của Rebel Satoshi có gì đặc biệt? Hướng dẫn...

Ngay cả khi thị trường phải đối mặt với nhiều biến động, các nhà đầu tư đang tìm kiếm loại tiền điện tử...

Các nhà đầu tư đồng ý hủy vụ kiện dân sự nếu Sam Bankman-Fried...

Các nhà đầu tư FTX có thể hủy bỏ các khiếu nại chống lại đồng sáng lập và cựu Giám đốc điều hành Sam...

Cổ phiếu khai thác Bitcoin đã tăng đột biến ngay trước sự kiện halving

Một số công ty khai thác Bitcoin được niêm yết trên sàn giao dịch chứng khoán Nasdaq đã kết thúc tuần giao dịch với...

Nhà phân tích cảnh báo Bitcoin và tiền điện tử có khả năng giảm...

Trong bối cảnh mạng halving Bitcoin lần thứ 4 đã diễn ra kết hợp với sự ra mắt của Runes, nhà đầu tư Elja...

Mạng Ethereum đã tạo ra lợi nhuận 370 triệu đô la trong Q1 2024

Blockchain Ethereum đã đạt được lợi nhuận ấn tượng trong năm nay khi thị trường tiền điện tử phục hồi và việc sử dụng...