Chuyển đến nội dung chính

Bài đăng

Tự học Solidity bài 36: Random Numbers safely. Tại sao tạo số ngẫu nhiên trong SOLIDITY lại không an toàn?

Random Numbers Safely.  Tự học Solidity bài 36: Tại sao tạo số ngẫu nhiên trong SOLIDITY lại không an toàn? Trong bài học trước chúng ta đã được giới thiệu về việc tạo số ngẫu nhiên trong SOLIDITY, tuy nhiên tôi cũng có ghi chú là việc tạo số ngẫu nhiên như vậy là không an toàn. Trong bài học này chúng ta cùng tìm hiêu tại sao nó lại không an toàn nhé :) Tạo số ngẫu nhiên trong SOLIDITY Nguồn ngẫu nhiên tốt nhất mà chúng ta có trong ngôn ngữ lập trình Solidity là hàm băm keccak256 . Chúng ta có thể làm như sau để tạo một số ngẫu nhiên từ 1 đến 100: uint randNonce = 0 ; uint random = uint ( keccak256 ( abi . encodePacked ( now , msg . sender , randNonce))) % 100 ; randNonce++; uint random2 = uint ( keccak256 ( abi . encodePacked ( now , msg . sender , randNonce))) % 100 ; Đầu vào của chúng ta sẽ lấy: dấu thời gian của now , msg.sender và một biến integer nonce tăng dần (một số chỉ được sử dụng một lần, vì vậy chúng ta không chạy cùng một hàm băm với các tham số đầu vào giống nhau

Khoá học Solidity bài 35: Withdraws & Transfer. Thiết lập cách rút tiền và chuyển tiền từ hợp đồng thông minh trong SOLIDITY

Withdraws & Transfer Solidity Khoá học Solidity . Thiết lập cách rút tiền và chuyển tiền từ hợp đồng thông minh trong SOLIDITY Thiết lập cách rút tiền và chuyển tiền từ hợp đồng thông minh trong SOLIDITY Trong bài học trước, chúng ta đã học cách gửi Ether vào một hợp đồng. Vậy điều gì sẽ xảy ra sau khi bạn gửi nó? Sau khi bạn gửi Ether đến một hợp đồng, nó sẽ được lưu trữ trong tài khoản Ethereum của hợp đồng và nó sẽ bị mắc kẹt ở đó - trừ khi bạn thêm một chức năng để rút Ether khỏi hợp đồng. Vì thế khi lập trình hợp đông thông minh mà có chức năng thanh toán, thì đừng quên chức năng để rút tiền ra khỏi hợp đồng nhé, không là mất oan vài nghìn ETH mà không có cách nào lấy lại được đâu :)) Bạn có thể viết một hàm để rút Ether khỏi hợp đồng như sau: contract GetPaid is Ownable { function withdraw ( ) external onlyOwner { address payable _owner = address ( uint160 (owner())); _owner. transfer ( address ( this ). balance ); } } Lưu ý rằng chúng ta đang sử dụng own

Tự học Solidity bài 34: Payable functions of Solidity. Hàm thanh toán - code một functions mà người dùng phải trả ETH để gọi hàm như thế nào?

Payable functions of Solidity.  Tự học Solidity. Hàm thanh toán.  Code một functions mà người dùng phải trả ETH để gọi hàm như thế nào?  Một số định nghĩa functions mà chúng ta đã được học  Chúng ta có các công cụ sửa đổi khả năng hiển thị của functions: Kiểm soát khi nào và ở đâu hàm có thể được gọi hàm đó như:  - private có nghĩa là nó chỉ có thể được gọi từ các hàm khác bên trong hợp đồng. -  internal  giống như private nhưng cũng có thể được gọi bằng các hợp đồng kế thừa. - external  chỉ có thể được gọi là bên ngoài hợp đồng. -  public  có thể được gọi ở bất cứ đâu, cả bên trong và bên ngoài hợp đồng. Chúng ta cũng có các công cụ sửa đổi trạng thái, cho chúng ta biết cách hàm tương tác với BlockChain: - view cho chúng ta biết rằng bằng cách chạy hàm, sẽ không có dữ liệu nào được lưu / thay đổi.  - pure cho chúng ta biết rằng hàm không chỉ không lưu bất kỳ dữ liệu nào vào blockchain mà còn không đọc bất kỳ dữ liệu nào từ blockchain.  Cả hai đều không tốn gas nếu gọi từ bên ngoài t

Tự học Solidity bài 33: For Loops. Sử dụng view và vòng lặp để tối ưu gas trong SOLIDITY

Tự học Solidity bài For Loops. vòng lặp trong ngôn ngữ lập trình SOLIDITY Summary for English Visiter function getEvens() pure external returns(uint[] memory) { uint[] memory evens = new uint[](5); uint counter = 0; for (uint i = 1; i <= 10; i++) { if (i % 2 == 0) { evens[counter] = i; counter++; } } return evens; } //This function will return an array with the contents [2, 4, 6, 8, 10]. Sử dụng view và vòng lặp để tối ưu gas trong SOLIDITY Quay lại ví dụ những thây ma zombie của chúng ta, chúng ta không thể lưu trữ zombie cho riêng mỗi chủ sở hữu thành một mảng riêng vì như vậy rất tốn gas. Đặc biệt là khi có thao tác chuyển đổi zombie từ chủ sở hữu A sang chủ sở hữu B. Như thế sẽ phát sinh số lượng công việc gồm 3 bước: 1. Chuyển zombie đến mảng zombie của chủ sở hữu mới.  Xóa thây ma khỏi mảng zombie chủ sở hữu cũ.  2. Di chuyển các thây ma trong bộ sưu tập zombie của chủ sở hữu cũ (để để lấp vào chỗ trống zombie chuyển đi) và sau đó giảm độ dài

Solidity Web3 bài 32: View Functions không tốn GAS khi gọi từ bên ngoài hợp đồng. Tối ưu gas trong SOLIDITY

View Functions Tự học Solidity bài 32: View Functions không tốn GAS khi gọi từ bên ngoài hợp đồng. Tối ưu gas trong SOLIDITY Summary for English Visiter 1. view functions don't cost any gas when they're called externally by a user. 2. One of the more expensive operations in Solidity is using storage — particularly writes. function getArray() external pure returns(uint[] memory) { // Instantiate a new array in memory with a length of 3 uint[] memory values = new uint[](3); // Put some values to it values[0] = 1; values[1] = 2; values[2] = 3; return values; } Tâm sự chút :) Sau bài học này chúng ta sẽ dễ dàng phân biệt được khi nào tốn GAS và khi nào thì không. Nếu một chức năng chỉ đọc dữ liệu trên blockchain thì nó sẽ không tốn GAS, những chức năng có ghi dữ liệu vào block và đồng bộ tât cả các khối khác trên blockchain thì nó phải mất phí GAS. Chính vì việc đọc dữ liệu chuỗi trên blockchain không mất phí GAS nên mới có những trang web tra cứu chuỗi khối mà chún

Khoá học Solidity bài 31: Function modifiers arguments. Hàm modifiers có tham số trong SOLIDITY

Function modifiers arguments Tự học Solidity bài 31: Function modifiers với arguments. Hàm modifiers có tham số trong SOLIDITY Summary for English Visiter mapping (uint => uint) public age; modifier olderThan (uint _age, uint _userId) { require(age[_userId] >= _age); _; } function driveCar(uint _userId) public olderThan (16, _userId) { } Bài học này chúng ta tìm hiểu sâu hơn về công cụ sửa đổi hàm Function modifiers. Trước đây ta đã được tìm hiểu về onlyOwner - giúp chúng ta có thêm những quyền hạn riêng cho người sở hữu hợp đồng. Nhưng cũng có rất nhiều trường hợp để chúng ta sử dụng  Function modifiers một cách linh hoạt. Ví dụ như check nhanh những người có đủ 18 tuổi mới được tham gia một chức năng dành cho người lớn chẳng hạn. Nhu cầu như thế thì chúng ta cần truyền tham số cho hàm  modifiers. Và hôm nay chúng ta cùng tim hiểu cách thức triển khai nhé. Công cụ sửa đổi hàm có đối số Chúng ta đi tìm hiểu về ví dụ sau: // A mapping luu tru tuoi mapping ( uint => ui

Tài liệu Solidity bài 30: Structs arguments. Truyền dữ liệu cấu trúc làm đối số trong Solidity.

Structs arguments Tự học Solidity bài 30: Structs arguments. Truyền dữ liệu cấu trúc làm đối số trong Solidity. Trong bài học này chúng ta tiếp tục thực hành về sử dụng các biến về thời gian và tìm hiểu thêm về cách truyền con trỏ biến structs. Ta sẽ đi cụ thể vào ví dụ để hiểu rõ cách sử dụng biến thời gian làm tác vụ đếm thời gian hồi chiêu của zombie. Time Cooldowns Nhiệm vụ bài học: Làm cho Zombies không thể ăn cho đến khi thời gian hồi chiêu của chúng trôi qua Điều này sẽ làm cho zombie không thể  ăn và các chức năng khác của zombie xây dựng sau này cũng sẽ có thời gian hồi chiêu Đầu tiên, chúng ta sẽ xây dựng xác định một số hàm trợ giúp cho phép chúng ta thiết lập và kiểm tra thời gian sẵn sàng của zombie.    function _triggerCooldown(Zombie storage _zombie) internal {     _zombie.readyTime = uint32(now + cooldownTime);   }   function _isReady(Zombie storage _zombie) internal view returns (bool) {       return (_zombie.readyTime <= now);   } Truyền cấu trúc làm đối số Bạn có