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

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...

Giá Coin hôm nay 25/11: Bitcoin và các altcoin lớn quay đầu giảm khi...

Bitcoin quay đầu về dưới $96.000 nhưng sau đó đã nhanh chóng lấy lại đà phục hồi và khép lại ngày hôm qua trong...

Chủ tịch FSC Hàn Quốc bác bỏ khả năng xây dựng kho dự trữ...

Chủ tịch Ủy ban Dịch vụ Tài chính (FSC) Hàn Quốc, Kim Byung-hwan, đã bác bỏ khả năng xây dựng kho dự trữ Bitcoin...
4-altcoin-tang

Dòng tiền có thể chảy vào 4 altcoin này khi giá Bitcoin đi ngang

Bitcoin đã giảm xuống dưới mức $96.000 vào ngày 24 tháng 11, cho thấy các trader ngắn hạn đang chốt lời gần ngưỡng $100.000....
MicroStrategy ‘tích cực theo đuổi’ việc mua thêm Bitcoin

Michael Saylor gợi ý MicroStrategy có thể thực hiện một đợt mua Bitcoin lớn...

Michael Saylor, đồng sáng lập MicroStrategy, vừa ám chỉ khả năng công ty sẽ tiếp tục gia tăng lượng Bitcoin nắm giữ sau khi...

500 triệu đô la WBTC bị đốt sau thông báo delist của Coinbase và...

Vào ngày 19 tháng 11 năm 2024, Coinbase đã công bố quyết định ngừng niêm yết Wrapped Bitcoin (WBTC) trên nền tảng của mình,...

Thanh lý đạt $490 triệu khi Bitcoin thoái lui, altcoin tăng vọt

Bitcoin đã thoái lui sau khi không thể vượt qua mốc $100.000 vào ngày 24 tháng 11, dẫn đến một trong những sự kiện...