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

Tỷ lệ cược cho Berachain và Linea airdrop trong Q1 trên Polymarket tăng vọt

Tỷ lệ cược Berachain và Linea airdrop trong Q1 trên Polymarket tăng vọt

Tỷ lệ cược đối với các đợt airdrop của Berachain và Linea trong quý đầu tiên năm 2025 đang ghi nhận mức tăng đáng...

Luật sư ủng hộ crypto kêu gọi chính quyền Trump điều tra Chiến dịch...

John Deaton, một trong những người nổi bật trong cộng đồng crypto và là cựu công tố viên Hoa Kỳ, vừa đưa ra một...

Khối lượng giao dịch hợp đồng tương lai DEX đạt 285 tỷ đô la...

Vào tháng 12, tỷ lệ khối lượng giao dịch tương lai trên các sàn DEX so với CEX đã đạt mức cao nhất mọi...

Lời tiên tri của Satoshi Nakamoto tái xuất hiện khi Bitcoin bước sang tuổi...

Một tuyên bố mang tính lịch sử từ nhà sáng tạo Bitcoin ẩn danh, Satoshi Nakamoto, gần đây đã được tiết lộ, khiến cộng...

Ripple vs SEC: Liệu Gary Gensler sắp mãn nhiệm có nộp bản tóm tắt...

Cuộc chiến pháp lý giữa SEC và Ripple vẫn đang là một chủ đề nóng, với tất cả sự chú ý đổ dồn vào...

‘MicroStrategy của Dogecoin’ ra mắt chiến lược Lợi suất DOGE, hướng đến Bitcoin và...

Spirit Blockchain Capital, một công ty đầu tư công khai tại Canada, đã công bố kế hoạch tận dụng lượng nắm giữ Dogecoin (DOGE)...
ca-voi-xrp

Cá voi XRP dừng tích lũy, điều gì tiếp theo?

Giá XRP đã duy trì trạng thái tích lũy suốt tháng qua, với mức tăng khiêm tốn chỉ 2,2%. Mặc dù đã hình thành...
Bitcoin dành chiến thắng trong khi Fed in thêm 'giấy vệ sinh Fiat'

Arthur Hayes dự báo Bitcoin sẽ đạt 1 triệu đô la nhờ điều này

Arthur Hayes, đồng sáng lập BitMEX, mới đây đã đưa ra một nhận định đáng chú ý về tiềm năng của Bitcoin, cho rằng...
sui-tang

SUI lập đỉnh mới là 5,35 đô la, vượt TON và LINK trở thành...

Token gốc của Sui Network, SUI, hiện đang đạt vốn hóa thị trường hơn 15 tỷ đô la, vượt qua TON và Chainlink để...

Điểm tin tuần 30/12-05/01: Bitcoin phục hồi về $98.000 sau đợt điều chỉnh –...

Bitcoin hiện đã giảm hơn 10% so với mức ATH $108.300 được ghi nhận vào ngày 17 tháng 12. Dữ liệu cho thấy đồng...
altcoin-tang

Top Altcoin bứt phá mạnh mẽ trong tuần đầu tháng 1/2025

Ba altcoin nổi bật trong tuần qua gồm Fartcoin (FARTCOIN), SPX6900 (SPX) và Ethena (ENA), với những màn trình diễn ấn tượng. FARTCOIN, một...

Dòng Bitcoin vào sàn giao dịch và dòng ra của thợ đào giảm –...

Dòng Bitcoin chảy vào sàn giao dịch — tổng số BTC được chuyển đến các sàn giao dịch — và dòng ra của thợ...
7 Altcoin đáng chú ý với tiềm năng ROI lớn vào năm 2025

[QC] 7 Altcoin đáng chú ý với tiềm năng ROI lớn vào năm 2025

Các nhà đầu tư thông thái tìm kiếm các dự án có nền tảng cơ bản vững chắc và tiềm năng tăng trưởng cao...

Chuyện thật như đùa: 5 câu chuyện kỳ quặc trong giới crypto năm 2024

Năm 2024 có thể được coi như năm trưởng thành của ngành công nghiệp crypto, với sự ra mắt của các quỹ Bitcoin ETF...
Hoa Kỳ chiếm hơn 40% hashrate Bitcoin toàn cầu

Hoa Kỳ chiếm hơn 40% hashrate Bitcoin toàn cầu: Báo cáo

Vào cuối năm 2024, Hoa Kỳ đã chiếm hơn 40% hashrate toàn cầu của mạng Bitcoin — tổng sức mạnh tính toán bảo mật...
hack

Nhìn lại 10 vụ hack và exploit tiền điện tử tồi tệ nhất năm...

Năm 2024 tiếp tục là một năm đầy thách thức đối với người dùng và các công ty tiền điện tử về bảo mật...