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

Memecoin và AI lao dốc trong khi Bitcoin vẫn mạnh

Mặc dù ban đầu các trader tỏ ra lạc quan, nhưng memecoin lại không đạt được hiệu suất như mong đợi. Điều này được...

Các quỹ đầu tư nâng tiếp xúc Bitcoin ETF lên 34,3 tỷ USD, tăng...

Một báo cáo gần đây từ River cho thấy mức tiếp xúc của quỹ đầu cơ và cố vấn đầu tư (RIA) với Bitcoin thông...

PEPE cần đòi lại vùng này để trở lại xu hướng tăng

Sau một đợt điều chỉnh lớn trên thị trường tiền điện tử, giá Pepe (PEPE) đang kiểm tra mức hỗ trợ quan trọng khi giao...

610.000 LINK được di chuyển trong một ngày – Liệu đà tăng có bị...

Thị trường Chainlink (LINK) đã chứng kiến ​​sự thay đổi đáng kể với 610.000 LINK được chuyển đến các sàn giao dịch trong 24...

Dave Portnoy: “Quá nhiều trẻ con” trên thị trường nên không thể ra mắt...

Người sáng lập Barstool Sports, Dave Portnoy, tuyên bố rằng có quá nhiều "trẻ con" trong thị trường meme coin nên ông không thể...

Mayer Multiples là gì? Cách dự đoán đáy và đỉnh trong đầu tư Bitcoin

Trong thế giới đầu tư tiền mã hóa, đặc biệt là Bitcoin, việc xác định thời điểm mua vào (đáy) hay bán ra (đỉnh)...
vi-tru-lanh-bitcoin-ledger-nano-s

Ví Ledger là gì? Hướng dẫn sử dụng ví lạnh Ledger

Trong thế giới tiền mã hóa, việc bảo vệ tài sản số là ưu tiên hàng đầu của mọi nhà đầu tư. Một trong...

Cá voi crypto đang mua gì sau khi thị trường sụp đổ?

Cá voi đã mua FET, LINK và WLD trong bối cảnh thị trường crypto điều chỉnh mạnh. Việc tích lũy chiến lược các altcoin...

Tìm hiểu chiêu thao túng giá Spoofing

Spoofing là một kỹ thuật thao túng giá bất hợp pháp trên thị trường tài chính, nơi các nhà giao dịch sử dụng lệnh...
Inclusive Layer

Delta Blockchain ra mắt “Inclusive Layer” giúp đơn giản hóa phát triển ứng dụng...

Theo thông báo vào thứ 4, nhà sáng lập Delta Blockchain Fund, Kavita Gupta, đang ra mắt chain mới dành cho người dùng có...
CoinEx công bố “Sự kiện đặc biệt CET

CoinEx công bố “Sự kiện đặc biệt CET: Tham gia xếp hạng khối lượng...

CoinEx rất vui mừng thông báo về sự ra mắt của chương trình khuyến mãi "Sự kiện đặc biệt CET: Tham gia xếp hạng...

Oklahoma thúc đẩy luật dự trữ Bitcoin trong khi các bang khác tạm dừng

Oklahoma tiến gần hơn đến việc thiết lập quỹ dự trữ Bitcoin của bang sau khi Ủy ban Giám sát Chính phủ Hạ viện...

Hạ viện Mỹ sắp hủy quy định thuế tiền điện tử gây tranh cãi...

Các nhà lập pháp Mỹ vừa bỏ phiếu ủng hộ việc hủy bỏ một quy định thuế gây tranh cãi, yêu cầu các "môi...

Hedera (HBAR) chật vật dưới $0,20 khi phe gấu siết chặt kiểm soát

Hedera (HBAR) đã giảm 37% trong 30 ngày qua, với giá giao dịch dưới mốc $0,30 gần một tháng nay. Các chỉ báo kỹ...

Pi Network (PI) lập ATH mới sát $3 – Liệu giá có thể chạm...

Pi Network (PI) đã tăng vọt hơn 70% trong 24 giờ qua, đẩy vốn hóa thị trường lên 16 tỷ USD và khối lượng...
Gobit

CEO Gotbit bị dẫn độ sang Hoa Kỳ vì cáo buộc thao túng thị...

Theo Văn phòng Luật sư Hoa Kỳ tại Quận Massachusetts, nhà sáng lập và CEO Aleksei Andriunin của Gotbit, một công dân Nga, đã...