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

Bài đăng

Tự học Solidity bài 26: Ownable Contracts - Chủ sở hữu Hợp đồng có các quyền đặc biệt

Ownable Contracts   Tự học Solidity bài 26: Ownable Contracts - Chủ sở hữu Hợp đồng có các quyền đặc biệt Trong ví dụ ở bài trước ( bài 25 ), bạn có phát hiện ra lỗ hổng bảo mật không? setKittyContractAddress  được khai báo là external , tức là bất kỳ ai cũng có thể gọi nó! Điều đó có nghĩa là bất kỳ ai cũng có thể thay đổi địa chỉ của hợp đồng CryptoKitties trong hợp đồng  và phá vỡ ứng dụng của chúng ta! Chúng ta muốn có chức năng để cập nhật địa chỉ này trong hợp đồng của mình, nhưng chúng ta lại không muốn tất cả mọi người có thể cập nhật nó. Để xử lý những trường hợp như thế này thì chúng ta tạo các hợp đồng Có thể sở hữu Ownable Contracts  - nghĩa là hợp đồng này có một chủ sở hữu (là bạn) có các quyền đặc biệt. Hợp đồng có thể sở hữu của OpenZeppelin Dưới đây là hợp đồng có thể sở hữu được lấy từ thư viện OpenZeppelin Solidity. OpenZeppelin là một thư viện các hợp đồng thông minh an toàn và được cộng đồng kiểm duyệt mà bạn có thể sử dụng trong DApp của riêng mình. Sau bài học nà

Tự học Solidity bài 25: Thực hành tránh phụ thuộc vào nhưng yếu tố bên ngoài hợp đồng

Bài thực hành Tự học Solidity bài 25: Thực hành tránh phụ thuộc vào nhưng yếu tố bên ngoài hợp đồng.  Trong khoá học Solidity miễn phí online tại website TuHocSolidity.com Trong ví dụ dưới đây, chúng ta đang Fix cứng địa chỉ ckAddress trong hợp đồng.  contract ZombieFeeding is ZombieFactory { // 1. Remove this: address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d ; // 2. Change this to just a declaration: KittyInterface kittyContract = KittyInterface ( ckAddress ); // 3. Add setKittyContractAddress method here      ... } Để tránh phụ thuộc vào địa chỉ này có vấn đề gì, trong hợp đồng của chúng ta thay vì Fix cứng địa chỉ hợp đồng CryptoKitties vào DApp, chúng ta tạo một hàm setKittyContractAddress cho phép chúng ta thay đổi địa chỉ này trong tương lai trong trường hợp có điều gì đó xảy ra với hợp đồng CryptoKitties . Các bước cần làm là: 1. Xóa dòng mã fix cứng ckAddress . 2. Thay đổi dòng mà chúng ta đã tạo kittyContract để chỉ khai báo biến - tức là không

Tự học Solidity bài 24: Tính bất biến của hợp đồng thông minh khi đã xuất bản lên Blockchain

Tính bất biến Tự học Solidity. Tính bất biến của hợp đồng thông minh khi đã xuất bản lên Blockchain.  Trong khoá học Solidity miễn phí online tại website TuHocSolidity.com Từ bài học nay trở đi sẽ là những kiến thức nâng cao trong khoá học: Tự học SOLIDITY của bạn! Ngôn ngữ lập trình Solidity khá giống với các ngôn ngữ khác như JavaScript, Kotlin. Nhưng có một số điểm mà trong đó Ethereum DApps thực sự khá khác so với các ứng dụng bình thường. Như trong ví dụ sau đây là cách hàm IF của Solidity hoạt động, rất giống JS phải không nào. f unction   eatBLT ( string   memory  sandwich)  public  {    if  ( keccak256 ( abi . encodePacked (sandwich)) ==  keccak256 ( abi . encodePacked ( "BLT" ))) {     eat();   } } Điểm khác biệt đó là: sau khi bạn triển khai hợp đồng lên mạng lưới của Ethereum, hợp đồng đó là bất biến,  nó không bao giờ có thể được sửa đổi hoặc cập nhật lại!!! Code mà bạn triển khai trong hợp đồng sẽ ở đó vĩnh viễn trên blockchain.  Đây là một lý do tại sao bảo mật

Tự học Solidity bài 23: Xử lý hàm có nhiều giá trị trả về Multiple Return Values trong ngôn ngữ lập trình Solidity.

Multiple Return Values Xử lý hàm có nhiều giá trị trả về Multiple Return Values trong ngôn ngữ lập trình Solidity. Summary for English Visiter function multipleReturns() internal returns(uint a, uint b, uint c) { return (1, 2, 3); } function processMultipleReturns() external { uint a; uint b; uint c; // get all A,B,C (a, b, c) = multipleReturns(); } function getLastReturnValue() external { uint c; (,,c) = multipleReturns(); //only C } Thank you! Khác với các ngôn ngữ lập trình mà ta đã quen thuộc, ngôn ngữ solidity hỗ trợ nhiều giá trị trả về trong một hàm. Vậy làm cách nào để chúng ta có thể lấy được các giá trị trả về mong muốn trong một tập các dữ liệu được returns? Để trả lời cho câu hỏi này chúng ta hãy tìm hiểu bài học thứ 23 này nhé. Xử lý nhiều giá trị trả về Hàm getKitty này là ví dụ đầu tiên mà chúng tôi thấy rằng trả về nhiều giá trị. Hãy xem cách mà chúng ta lấy dữ liệu trả về của hàm: function multipleReturns ( ) internal returns ( uint a, uint b, u

Tự học Solidity bài 22: Sử dụng Interface trong ngôn ngữ lập trình Solidity

Sử dụng Interface Trong ngôn ngữ lập trình Solidity. Trong khoá học online miễn phí Tự học lập trình web3 - Tự học ngôn ngữ lập trình Solidity. Summary for English Visiter contract NumberInterface { function getNum(address _myAddress) public view returns (uint); } contract MyContract { address NumberInterfaceAddress = 0xab38... // Address FavoriteNumber contract on ETH blockchain NumberInterface numberContract = NumberInterface(NumberInterfaceAddress); // `numberContract` = contract FavoriteNumber function someFunction() public { // Call `getNum` from contract: uint num = numberContract.getNum(msg.sender); } } Trong bài học trước chúng ta đã biết rằng, để tương tác với một hợp đồng thông minh khác thì phải xây dựng một bộ xương hợp đồng Interface và khai báo trong đó nhưng hàm của hợp đồng mà chúng ta muốn tương tác vào nội dung Interface. Trong bài học này chúng ta sẽ học các liên kết Interface đó với hợp đồng đang có ở trên blockchain.  Sử dụng Interface Tiếp

Tự học Solidity bài 21: Tương tác với các hợp đồng khác trong ngôn ngữ lập trình Solidity

Interface Solidity Tương tác với các hợp đồng khác trong ngôn ngữ lập trình Solidity.  Trong khoá học online miễn phí Tự học lập trình web3 - Tự học ngôn ngữ lập trình Solidity Summary for English Visiter contract NumberInterface { function getNum(address _myAddress) public view returns (uint); } contract MyContract { address NumberInterfaceAddress = 0xab38... // Address FavoriteNumber contract on ETH blockchain NumberInterface numberContract = NumberInterface(NumberInterfaceAddress); // `numberContract` = contract FavoriteNumber function someFunction() public { // Call `getNum` from contract: uint num = numberContract.getNum(msg.sender); } } Khi chúng ta có nhu cầu tương tác với một hợp đồng khác trên Blockchain, có thể hợp đồng thuộc bạn sở hữu, hoặc là một hợp đồng có sẵn trên blockchain. Vậy với ngôn ngữ solidity chúng ta sẽ phải làm từng bước như nào? Trong bài học này chúng ta cùng tìm hiểu nhé. Tương tác với các hợp đồng khác Để hợp đồng của chúng tôi nó

Tự học Solidity bài 20: Internal và External trong ngôn ngữ lập trình Solidity

Internal & External Ngôn ngữ lập trình Solidity. Tự học Solidity miễn phí.  Trong khoá học online miễn phí Tự học lập trình web3 - Tự học ngôn ngữ lập trình Solidity Summary for English Visiter contract Sandwich { uint private sandwichesEaten = 0; function eat() internal { sandwichesEaten++; } } contract BLT is Sandwich { uint private baconSandwichesEaten = 0; function eatWithBacon() public returns (string memory) { baconSandwichesEaten++; // We can call this here because it's internal eat(); } } Thank you! Bạn hay mở lại 2 file  zombilefactory.sol và  zombiefeeeding.sol Nếu ta gọi hàm  _createZombie trong hàm feedAndMultiply như ví dụ dưới đây thì sẽ bị lỗi   function feedAndMultiply ( uint _zombieId , uint _targetDna ) public { require ( msg . sender == zombieToOwner [ _zombieId ]); Zombie storage myZombie = zombies [ _zombieId ]; _targetDna = _targetDna % dnaModulus ; uint newDna = ( myZombie . dna + _targetDna