Lập trình smart contracts: Phần 2 Viết smart contracts đầu tiên

Updated: 27/04/2018 at 17:30

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.

Được đề cập trong bài viết
Bình luận
Đang tải
Mới cập nhật

Avalanche (AVAX) bất ngờ trở thành mục tiêu của một chiến dịch mua sắm trị giá hàng tỷ đô từ các quỹ tài sản kỹ thuật số niêm yết công khai (DAT). AgriFORCE thông báo sẽ đổi tên thành AVAX One và tích lũy khoảng 700 triệu USD AVAX. Trong khi... ...

Khi Mỹ bước sang ngày thứ hai của đợt đóng cửa một phần chính phủ, thị trường crypto đang hồi phục mạnh. Bitcoin có lúc chạm 121.000 USD hôm thứ Năm, lần đầu tiên kể từ giữa tháng 8, trong khi Ethereum duy trì trên 4.500 USD — mức cao... ...

Bitcoin có thể bứt phá lên mức đỉnh lịch sử mới 150.000 USD trước khi năm 2025 khép lại, khi dòng tiền đầu tư tìm đến các tài sản trú ẩn an toàn song hành cùng vàng. Nhận định này được đưa ra bởi Charles Edwards, nhà sáng lập Capriole... ...

Thị trường prediction markets (sàn dự đoán) đã có bước nhảy vọt trong tháng 9 khi khối lượng giao dịch hàng tháng tăng hơn gấp đôi lên 4,28 tỷ USD, trong khi giao dịch memecoin trên Solana hạ nhiệt. Câu hỏi được đặt ra trong giới đầu cơ rủi ro... ...

Giá Avalanche (AVAX) đã nhích thêm 1% vào thứ Năm, nối tiếp đà tăng 2% của ngày trước đó nhờ động lực từ kế hoạch kho bạc hệ sinh thái trị giá 1 tỷ USD. Triển vọng kỹ thuật vẫn duy trì tín hiệu tích cực, khi cả dữ liệu... ...

Hedera (HBAR) đang di chuyển trong mô hình cái nêm giảm suốt hơn 10 tuần qua, và hiện tại altcoin này đang nỗ lực bứt phá ra khỏi khuôn khổ đó. Nếu thành công, xu hướng có thể đảo chiều mạnh mẽ theo hướng ủng hộ phe bò. Tuy nhiên,... ...

Một “cá voi” bất ngờ rút 11 triệu WLFI, tương đương 2,15 triệu USD, khỏi thanh khoản và xả bán, tạo ra cú sốc mạnh trên thị trường. Dòng tiền ròng hợp đồng tương lai (Futures Netflow) giảm sâu xuống -14,81 triệu, trong khi lực bán lẻ áp đảo với... ...

Tại hội nghị Token2049 ở Singapore ngày thứ Năm, CEO Robinhood Vlad Tenev nhận định rằng phần lớn các thị trường lớn có thể thiết lập khuôn khổ pháp lý cho tài sản số hóa (asset tokenization) trong vòng 5 năm tới. “Tôi nghĩ token hóa giống như một đoàn... ...

Chỉ số memecoin GMCI đã duy trì trạng thái gần như “dậm chân tại chỗ” quanh mức 220 trong nhiều tháng qua, giảm mạnh so với đỉnh 600 đạt được trong giai đoạn cao trào đầu cơ của năm ngoái, khi những cái tên như Fartcoin, BONK và WIF chiếm... ...

Chính phủ Anh đang tìm cách giữ lại phần lớn số Bitcoin trị giá 7 tỷ USD bị tịch thu trong một vụ lừa đảo đầu tư có nguồn gốc từ Trung Quốc, sau khi kẻ cầm đầu bị kết án trong tuần này. Tại Tòa án Hình sự Southwark... ...

Xem thêm bài viết

Chọn chế độ hiển thị:
Bình thường Bảo vệ mắt Dark Mode