Lập trình Blockchain - Bài 04: Solidity cơ bản (P2) - Định nghĩa hàm chức năng
Trong bài trước chúng ta đã khởi động bằng một số concept cơ bản của Solidity bằng cách tạo một contract đơn giản và khám phá một số cấu trúc cùng khái niệm đơn giản. Bây giờ chúng ta sẽ tiếp tục bằng một số khái niệm về định nghĩa hàm chức năng, event cho contract.
1. Các function
Một function trông như sau
pragma solidity ^0.4.22;
contract DeveloperFactory {
// Let's create a Developer!
uint maxAge = 100;
uint minAge = 5;
struct Developer {
string name;
uint id;
uint age;
}
Developer[] public developers;
function _createDeveloper( string _name, uint _id, uint _age ) private{
developers.push( Developer( _name, _id, _age ) );
}
function _generateRandomId( string _str ) private pure returns (uint){
uint rand = uint(keccak256(_str));
return rand;
}
function createRandomDeveloper( string _name, uint _age ) public view {
require(_age > minAge);
require(_age < maxAge);
uint randId = _generateRandomId( _name );
_createDeveloper(_name, randId, _age );
}
}
function
keyword. Các function có thể nhận các parameter. Và các function mặc định là public
. Tôi đã add private
keyword để làm cho function private. Ngoài ra tôi cũng add một underscore (là dấu gạch chân _ ) trước private function hoặc variable để phân biệt nó với các public variables. Việc này không bắt buộc, chỉ là tôi nghĩ nó sẽ dễ đọc hơn.Ethereum có một hash function keccak256
có sẵn, nó là một phiên bản của SHA3. Pass cho nó string bất kì và bạn sẽ có được một số lục phân 256-bit.
Như bạn có thể thấy, chúng ta đều type-casting (chuyển đổi kiểu dữ liệu) từ keccak256
value sang uint
value và return nó.
Ngoài private
keyword, bạn cần phải add thêm vài thứ vào function:
- Hãy dùng
returns
và xác định dạng mà function return. Ở đây nó trả về một dạnguint
. view
nghĩa là function cần xem một vài biến của Contract, mà không được thay đổi nó. Ở đây FunctioncreateRandomDeveloper
cần xem các biếnminAge
andmaxAge
.pure
nghĩa là function không truy cập vào bất kì data trong app. Nó chỉ trả về cái gì đó dựa trên các parameter,_generateRandomId
chính làpure
.
Chúng ta có 3 function là:
_generateRandomId
tạo ra một Id ngẫu nhiên cho Developer
của chúng ta bằng cách dùng function keccak256 sẵn có.
_createDeveloper
tạo và push một Developer struct
mới thành mảng.
createRandomDeveloper
là public function duy nhất. Nó sẽ check xem age
được cung cấp có đúng hay không. Các câu lệnh require
sẽ báo error nếu nó không đúng (age lớn hơn 100 và ít hơn 5 trong trường hợp này). Từ đó, function cuối là cái có thể được call từ ngoài contract.
2. Các event
Bạn có thể tạo các event để có thể tương tác với những gì diễn ra trên blockchain và show trên front end. App của bạn sẽ dựa theo các event và phản hồi theo đó.
pragma solidity ^0.4.22;
contract DeveloperFactory {
// Let's create a Developer!
event NewDeveloper(uint devId, string name, uint age);
uint maxAge = 100;
uint minAge = 5;
struct Developer {
string name;
uint id;
uint age;
}
Developer[] public developers;
function _createDeveloper( string _name, uint _id, uint _age ) private{
uint id = developers.push( Developer( _name, _id, _age ) ) - 1;
newDeveloper(id, _name, _age);
}
function _generateRandomId( string _str ) private pure returns (uint){
uint rand = uint(keccak256(_str));
return rand;
}
function createRandomDeveloper( string _name, uint _age ) public view {
require(_age > minAge);
require(_age < maxAge);
uint randId = _generateRandomId( _name );
_createDeveloper(_name, randId, _age );
}
}
Chúng ta tạo event bằng event. Trong Contract, event sẽ có 3 parameter bao gồm devId, name và age. Chúng ta sẽ kích hoạt event trong hàm _createDeveloper. Idđược lấy từ phương thức push trên mảng Developer. Nó sẽ trả về một độ dài mới cho mảng. Vì array bắt đầu 0, chúng ta phải trừ đi 1 để lấy developer id.