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

Đề xuất tái phân bổ lượng phát thải CAKE đến farming pool của PancakeSwap...

Nhằm mục đích khuyến khích các nhà cung cấp thanh khoản tham gia vào các pool chiến lược nhằm cải thiện tính thanh khoản...
Bitcoin

Bitcoin vượt 61.700 USD sau báo cáo việc làm của Hoa Kỳ – Arthur...

Nền kinh tế Mỹ đã bổ sung thêm 175.000 việc làm trong tháng 4, theo báo cáo Bảng lương phi nông nghiệp của chính...
Bitcoin

Dòng ra Bitcoin ETF giảm – Giá BTC hợp nhất càng lâu thì tăng...

Giá Bitcoin giảm gần đây có một số điểm tương đồng với hành vi của nó sau khi các quỹ hoán đổi danh mục...
tether

CEO Tether Paolo Ardoino giới thiệu Pear Phone tiềm năng tích hợp ứng dụng...

Paolo Ardoino, CEO của Tether và đồng sáng lập nền tảng ngang hàng Holepunch, gần đây đã gợi ý về kế hoạch phát triển...

[QC] Đồng meme mới mang tên “Sealana” vừa tổ chức ICO trên SOL, đã...

Sealana, một meme coin mới vừa ra mắt trên nền tảng Solana, đang “làm mưa làm gió” sau khi huy động được hơn...
Moonbeam

Moralis bổ sung hỗ trợ cho Moonbeam Network để tăng cường các công cụ...

Theo một thông cáo báo chí, nền tảng phát triển Web 3 Moralis cho biết họ đã bổ sung hỗ trợ cho parachain Moonbeam...

Tin vắn Crypto 03/05: Bitcoin có thể chưa hoàn tất đợt điều chỉnh hiện...

Từ nhận định Bitcoin có thể chưa hoàn tất đợt điều chỉnh hiện tại đến Tether công bố mối quan hệ hợp tác với...

Layer 2 Shibarium của Shiba Inu hoàn thành hard fork

Shibarium, giải pháp layer 2 của Shiba Inu, đã hoàn thành đợt hard fork sẽ mang lại các giao dịch “nhanh như chớp” cũng...

[QC] Ba loại tiền điện tử rẻ hơn Pizza có thể mang lại lợi...

Trong bối cảnh tiền điện tử ngày càng phát triển, nơi các loại tiền điện tử lớn như Bitcoin và Ethereum dường như...

Số lượng tài khoản hoạt động trên Stacks đạt kỷ lục trong bối cảnh...

Mạng lưới Bitcoin layer-2 (L2) hàng đầu, Stacks, đã đạt được số lượng người dùng hoạt động ATH, được thúc đẩy bởi mối quan...

Token FRIEND của Friend.Tech giảm 99% sau khi debut

Nền tảng xã hội phi tập trung Friend.Tech hôm nay đã ra mắt và airdrop token FRIEND sau khi bị trì hoãn so với...

Giá Bitcoin có thể hợp nhất trong 2 tháng sau halving giữa lúc phí...

Trong bối cảnh giá Bitcoin điều chỉnh giảm hậu halving, người dùng hiện có thể thực hiện thanh toán bằng đồng tiền này một...

JPMorgan khuyến cáo thận trọng khi thị trường tiền điện tử đang bấp bênh

Trong đánh giá gần đây của các nhà phân tích JPMorgan, tương lai của tiền điện tử dường như không chắc chắn. Bất chấp...

[QC] Dự đoán giá tiền điện tử Bitbot 2024 – 2030: Tại sao các...

Khi thị trường tiền điện tử xôn xao về sự kiện halving Bitcoin gần đây, các nhà phân tích đang chuyển trọng tâm...

‘Mr.100’ mua 4.100 Bitcoin lần đầu tiên kể từ halving – BTC đã chạm...

Trong bối cảnh giá Bitcoin điều chỉnh hậu halving, cá voi Bitcoin “Mr. 100” đã tiến hành mua dip lần đầu tiên kể từ sự...

Bị chỉ trích, EigenLayer tung ra airdrop EIGEN trị giá 1.000 đô la cho...

Trong bối cảnh EigenLayer gây tranh cãi về chiến lược airdrop và bị chỉ trích là VC scam chỉ muốn hút thanh khoản, Eigen...