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

XRP tăng tốc: Đích đến 10 USD hay còn xa hơn nữa?

Giá XRP đã tăng gần 15% trong bảy ngày qua, từ mức đáy 1,61 USD lên 2,14 USD tại thời điểm viết bài. Theo...
Pi

Pi Network nhắm mốc 1 đô la: Bitcoin tăng mạnh có giúp Pi bứt...

Giá Pi Network đã có dấu hiệu phục hồi trong những ngày gần đây, đạt mức cao nhất trong hai tuần sau một đợt...

TOP 3 altcoin có xu hướng nổi bật hôm nay – Ngày 15 tháng...

Trong 24 giờ qua, thị trường tiền mã hóa đã chứng kiến sự sôi động trở lại, khi tổng vốn hóa toàn thị trường...
hack

Tài khoản X của Bộ trưởng Anh bị hack để quảng bá tiền điện...

Tài khoản X của Bộ trưởng Chính phủ Vương quốc Anh Lucy Powell gần đây đã bị hack để quảng bá tiền điện tử...
bitcoin

Wintermute: Bitcoin kiên cường trong thời kỳ suy thoái thị trường

Theo báo cáo ngày 14/4 từ nhà tạo lập thị trường Wintermute, Bitcoin đang thể hiện sự kiên cường mạnh mẽ trước những sóng...
doge-bch-giam

Thị trường bất ổn: Dogecoin (DOGE) và Bitcoin Cash (BCH) đứng trước rủi ro...

Dogecoin (DOGE) và Bitcoin Cash (BCH) lần lượt giảm 3% và 8% trong phiên giao dịch ngày thứ Ba, chịu tác động từ làn...

FOMO nguội lạnh, Cardano (ADA) gặp nguy

Dù đã phục hồi 28% từ đáy 0,5 USD, Cardano (ADA) vẫn đang bị "kẹt" gần một mức giá then chốt, nơi thị trường...
zec

Binance cân nhắc hủy niêm yết ZCash (ZEC), gây tranh cãi trong giới crypto

ZCash (ZEC) đã được thêm vào vòng bỏ phiếu hủy niêm yết lần nữa trên Binance. Việc này đã dấy lên lo ngại về...

Tin vắn Crypto 15/04: Bitcoin chuẩn bị cho đà tăng mạnh theo sau vàng...

Từ nhận định Bitcoin có xu hướng tăng mạnh theo sau vàng đến Bybit phủ nhận cáo buộc tính phí 1,4 triệu USD để...

Liệu mùa Altcoin sẽ đến khi tỷ lệ thống trị của Bitcoin đình trệ?

Bitcoin (BTC) đang cho thấy dấu hiệu căng thẳng khi bám vào mức hỗ trợ $65.000, làm dấy lên mối lo ngại trên toàn...
bitcoin

Bitwise: Bitcoin do các công ty niêm yết nắm giữ tăng 16% trong quý...

Theo công ty phát hành quỹ crypto Bitwise cho biết trong một bài đăng trên nền tảng X vào ngày 14/4, lượng Bitcoin do...

Dự báo giá VeChain: VET đứng trước cơ hội tăng trưởng hai chữ số

Giá VeChain (VET) dao động quanh ngưỡng $0,023 trong phiên giao dịch thứ Ba, sau khi vượt lên trên mô hình cái nêm giảm...

Pi Coin lên sàn futures giữa làn sóng FOMO mạnh mẽ

Sau khoảng thời gian im ắng, Pi Network bất ngờ trở lại đầy ấn tượng với mức tăng 80%, hiện đang được giao dịch...

3 altcoin cũ phát tín hiệu tăng giá – Đợt bùng nổ có đang...

Tính đến thời điểm viết bài vào thứ Ba, Algorand (ALGO), Decentraland (MANA) và JasmyCoin (JASMY) lần lượt giao dịch quanh các mốc $0,19,...

Gate.io là gì? Hướng dẫn đăng ký và sử dụng sàn giao dịch

Gate.io là một trong những sàn giao dịch tiền mã hóa hàng đầu thế giới, được thành lập vào năm 2013 và hiện đang...

Hàn Quốc chặn 14 ứng dụng crypto, bao gồm KuCoin và MEXC khỏi App...

Cơ quan quản lý tài chính hàng đầu Hàn Quốc vừa yêu cầu Apple chặn quyền truy cập trong nước đối với 14 nền...