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

El Salvador đang cân nhắc cho thợ đào Bitcoin thuê 170 ngọn núi lửa

El Salvador đang cân nhắc cho thợ đào Bitcoin thuê 170 ngọn núi lửa

El Salvador đang khám phá những cách sáng tạo nhằm nâng cao hiệu quả khai thác Bitcoin, với một đề xuất táo bạo từ...
MicroStrategy mua thêm 55.500 BTC Bitcoin với giá 5,4 tỷ đô la

MicroStrategy mua thêm 55.500 Bitcoin với giá 5,4 tỷ đô la

MicroStrategy vừa công bố đợt mua Bitcoin mới nhất với 55.500 BTC, trị giá khoảng 5,4 tỷ USD, tương ứng với mức giá trung...
Các nhà kinh tế dự đoán Fed sẽ thận trọng khi cắt giảm lãi suất vào năm 2025

Các nhà kinh tế dự đoán Fed sẽ thận trọng khi cắt giảm lãi...

Các nhà kinh tế nhận định rằng Cục Dự trữ Liên bang Hoa Kỳ (Fed) sẽ áp dụng cách tiếp cận thận trọng đối...

Thị trường meme coin ảm đạm nhưng Catslap bùng nổ hơn 50% trong ngày...

Trong khi các meme coin hàng đầu như Dogecoin, Pepe và Popcat đang có dấu hiệu chững lại, meme coin mới nổi Catslap (SLAP)...

Khối lượng giao dịch DEX hàng tháng của Solana lần đầu tiên vượt quá...

Lần đầu tiên trong lịch sử Solana, khối lượng giao dịch hàng tháng trên các sàn giao dịch phi tập trung (DEX) của mạng...

Tin vắn Crypto 25/11: Bitcoin có thể tăng vọt lên mức $500.000 vào 2025...

Từ nhận định Bitcoin có thể tăng vọt lên mức $500.000 vào năm 2025 đến HashKey Global đã công bố quan hệ đối tác...
satoshi-bitcoin

Satoshi Nakamoto có thể là siêu cá voi năm 2010, theo BTCparser

Các nhà nghiên cứu đưa ra giả thuyết mới về Satoshi Nakamoto: Nhà sáng lập Bitcoin chưa bao giờ biến mất và đã bí...
bitmex-tang-gia

Nhà sáng lập BitMEX Arthur Hayes tiết lộ mục tiêu giá cho Bitcoin (BTC)...

Nhà sáng lập BitMEX Arthur Hayes vừa đưa ra những dự đoán tích cực về Bitcoin (BTC), Dogecoin (DOGE) và chu kỳ thị trường...
pump-fun-chi-trich

Pump.fun đối mặt với những chỉ trích dữ dội khi người dùng sử dụng...

Kể từ khi ra mắt vào đầu năm nay, nền tảng memecoin Pump.fun đã trở thành một cái tên đáng chú ý trong ngành...

DeSci đang rất giống như DeFi đầu giai đoạn năm 2019

Các giao thức khoa học phi tập trung (DeSci) hiện đang ở giai đoạn tương tự như tài chính phi tập trung (DeFi) vào...
CHILLGUY

CHILLGUY tiếp tục tăng thêm 48% bất chấp lời cảnh báo từ người sáng...

Từ những xu hướng đình đám trên TikTok cho đến các ví tiền điện tử, meme “Chill Guy” đã nhanh chóng trở thành một...

Cameron Winklevoss kêu gọi tái điều tra cáo buộc tài trợ chiến dịch đối...

Cameron Winklevoss, đồng sáng lập sàn giao dịch Gemini, đã kêu gọi mở lại cuộc điều tra về các cáo buộc tài trợ chiến...

Ngân hàng Dự trữ Ấn Độ mở rộng nền tảng thanh toán xuyên biên...

Ngân hàng Dự trữ Ấn Độ (RBI) đang nỗ lực mở rộng nền tảng thanh toán xuyên biên giới của mình, cho phép thanh...
JPMorgan nghi ngờ về việc Elon Musk theo đuổi D.O.G.E. nhằm cải cách liên bang

Phố Wall lo ngại Bộ Hiệu quả Chính phủ (D.O.G.E) làm sụp đổ thị...

JPMorgan Chase đã công bố một báo cáo vào ngày 22 tháng 11, đánh giá Bộ Hiệu quả Chính phủ (D.O.G.E) – một cơ...

Metaplanet thực hiện bước đi quan trọng để thúc đẩy áp dụng Bitcoin tại...

Sau khi ký kết biên bản ghi nhớ (MoU) với Bitcoin Magazine vào ngày 26 tháng 7 năm 2024, Metaplanet đã chính thức công...

Các token layer 1 tăng trưởng mạnh mẽ khi thị trường đặt kỳ vọng...

Lời hứa về một môi trường quản lý ủng hộ tiền điện tử dưới chính quyền mới của Tổng thống Hoa Kỳ Donald Trump...