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

CIO Bitwise tin rằng Bitcoin vẫn đang trên đà hướng tới 250.000 USD trong...

00Trong một lưu ý dành cho nhà đầu tư gần đây, CIO Matt Hougan của Bitwise đã cung cấp một cái nhìn toàn diện...
Bitcoin

Đã đến lúc các thợ đào Bitcoin chuyển trọng tâm sau halving?

Các sự kiện halving Bitcoin đã tác động không nhỏ đến không gian tiền điện tử. Là một sự kiện được chờ đợi và...

Runes đang chiếm lĩnh và thống trị mạng Bitcoin, vượt mặt BRC-20

Sau khi ra mắt cùng với thời điểm halving Bitcoin, Runes đang thống trị hoạt động blockchain BTC, với hơn 81% giao dịch vào...
Meme Coin đã trở lại! Những Memecoin này đang thúc đẩy sự bùng nổ của tiền điện tử

[QC] Meme Coin đã trở lại! Những Memecoin này đang thúc đẩy sự bùng...

Meme coin đang tăng giá và có thể thúc đẩy hoạt động thị trường tiếp theo cũng như bùng nổ trong lĩnh vực...

Các quỹ ETF Bitcoin giao ngay của Hoa Kỳ chứng kiến dòng tiền ra...

Theo dữ liệu từ SoSoValue, các quỹ ETF bitcoin giao ngay của Hoa Kỳ đã chứng kiến tổng dòng tiền ra ròng hàng ngày...

Bitcoin memecoin DOG đạt mức vốn hóa thị trường 318 triệu USD sau khi...

DOG·GO·TO·THE·MOON (hay còn gọi là DOG), một memecoin Bitcoin được khắc thông qua giao thức Runes mới ra mắt, đã được airdrop cho hodler dự án...

[QC] Triệu phú Solana NFT, người đã dự đoán sự phục hồi của SOL...

Được biết đến với các phương pháp tiếp cận sáng tạo và tiềm năng tăng trưởng đáng kể, Solana (SOL) và DTX Exchange...

Changpeng Zhao đã thỉnh cầu được hưởng án treo do lo ngại bị tống...

Với lo ngại nếu bị phạt tù sẽ phải chấp hành bản án tại Trung tâm giam giữ Liên bang (FDC) SeaTac, Washington -...
mua-altcoin

Mô hình kỹ thuật quá khứ báo hiệu “mùa altcoin” đang đến gần

Giá Bitcoin đã phải vật lộn để giữ trên mức hỗ trợ quan trọng ở mức $64.800 sau khi hoàn thành đợt halving thứ...

Starknet mời các nhóm bị gắn nhãn sai nhận bù airdrop token STRK

Mặc dù Starknet đã triển khai airdrop vào tháng 2 nhưng một số người tham gia đủ điều kiện đã không thể nhận được...
Rollblock (RBLK) và Algorand (ALGO) nhắm mục tiêu 1 USD

[QC] Bitcoin (BTC) sẽ phá vỡ 150.000 USD trong năm nay? Rollblock (RBLK) và...

 Mặc dù Bitcoin đã chứng kiến một đợt thoái lui nhẹ, một phần do tình hình chính trị hiện tại ở Trung Đông, nhưng...

Giá HBAR giảm 36% sau khi BlackRock đính chính không chọn Hedera Hashgraph để...

BlackRock đã xác nhận rằng họ "không có mối quan hệ thương mại" với Hedera và không chọn Hedera Hashgraph để token hóa bất...

Lượng nắm giữ Bitcoin của MicroStrategy hiện chỉ bằng 1/2 tổng dự trữ của...

Sau khi tăng lượng nắm giữ BTC trong quý 1 năm 2024, công ty tình báo kinh doanh MicroStrategy hiện tích luỹ hơn 1%...

Giá Coin hôm nay 25/04: Bitcoin quay về quanh $ 64.000, altcoin đỏ lửa...

Đà phục hồi của thị trường dường như chững lại quanh $ 67.000 sau khi Bitcoin bất ngờ lao dốc về sát khu vực...

Đồng sáng lập Terra Do Kwon lần nữa nộp đơn kháng cáo dẫn độ

Cuộc tranh luận dẫn độ đồng sáng lập Terraform Labs Do Kwon ở Montenegro vẫn chưa kết thúc. Các luật sư đại diện Kwon đệ...

[QC] Những người nắm giữ TokenFi chuyển sang Bitbot khi các nhà đầu tư...

  Khi TokenFi điều hướng qua sự lên xuống và dòng chảy của một thị trường biến động, các nhà đầu tư tiền điện...