Giải cấu trúc hợp đồng thông minh
猎豹区块链安全
2018-12-03 11:51
本文约4852字,阅读全文需要约19分钟
Cùng tác giả khám phá bí ẩn về hợp đồng thông minh

Phần 1 Lời nói đầu


Hãy tưởng tượng bạn đang lái chiếc Mustang Mach 1969 phóng nhanh trên những con đường miền Tây nước Mỹ, ánh nắng chiếu lên những chiếc vành mạ vàng lộng lẫy, cả con đường chỉ có bạn và sa mạc, và chân trời vô tận chứng kiến ​​sự truy đuổi của bạn và mặt trời lặn . . . . . . .

Đang cảm thấy thư thái và sung sướng thì bỗng có một tiếng động lớn vang lên, chú ngựa thần tốc 335 mã lực của bạn bị làn khói trắng cuồn cuộn nhấn chìm, và lập tức biến thành một đầu máy hơi nước khiến bạn buộc phải dừng lại bên vệ đường.

Bạn định xem có gì sai nhưng khi bạn nhấc mui xe lên thì bạn không thể đọc được. Bạn không biết cái máy chết tiệt đó hoạt động như thế nào, vì vậy bạn nhấc điện thoại lên để gọi trợ giúp, chỉ để biết rằng không có tín hiệu gần đó...  



Tình huống được mô tả ở trên có giống với quá trình phát triển DApp mà bạn đang thực hiện không? Trong quá trình phát triển Dapp, một cách tương tự, chiếc xe hơi sang trọng là hợp đồng thông minh của bạn, vành và các vị trí được sửa đổi là những chi tiết nhỏ được cân nhắc kỹ lưỡng. Và một khi có vấn đề, bạn cần tìm câu trả lời trong mã bytecode EVM của hợp đồng thông minh.Trong hầu hết các trường hợp, bạn không biết chuyện gì đã xảy ra.

Nếu bạn là một nhà phát triển Dapp và đã gặp phải tình huống đáng xấu hổ ở trên, thì bạn không cần phải lo lắng về nó nữa!

Bởi vì, mục đích của loạt bài viết này là giải cấu trúc một hợp đồng Solidity đơn giản, xem xét mã byte của nó và chia nhỏ nó thành các cấu trúc dễ nhận biết, xuống mức thấp nhất. Chúng tôi sẽ mở mui chiếc xe thể thao của Solidity. Đến cuối loạt bài này, bạn sẽ cảm thấy thoải mái khi xem hoặc gỡ lỗi mã byte EVM. Loạt bài này tập trung vào việc làm sáng tỏ mã byte EVM được tạo bởi trình biên dịch Solidity, điều này thực sự đơn giản hơn nhiều so với vẻ ngoài của nó.


Sau đây là mã hợp đồng thông minh mà chúng tôi sẽ sử dụng khi giải cấu trúc:

pragma solidity ^0.4.24;

    contract BasicToken {


    uint256 totalSupply_;

    mapping(address => uint256) balances;

    constructor(uint256 _initialSupply) public {

    totalSupply_ = _initialSupply;

    balances[msg.sender] = _initialSupply;

    }


    function totalSupply() public view returns (uint256) {

    return totalSupply_;

    }


    function transfer(address _to, uint256 _value) public returns (bool) {

    require(_to != address(0));

    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender] - _value;

    balances[_to] = balances[_to] + _value;

    return true;

    }


   function balanceOf(address _owner) public view returns (uint256) {

   return balances[_owner];

   }

}

tiêu đề cấp đầu tiên


Biên dịch hợp đồng

Để biên dịch hợp đồng, chúng tôi sẽ sử dụng Remix (địa chỉ: https://remix.ethereum.org).

Khi bạn mở trình biên dịch Remix, hãy nhấp vào nút + ở góc trên bên trái phía trên khu vực trình duyệt tệp để tạo hợp đồng thông minh mới. Đặt tên tệp thành BasicToken.sol. Sau khi tạo, dán đoạn mã trên vào trình chỉnh sửa.

Ở bên phải, chuyển đến các tùy chọn cho "Cài đặt" và đảm bảo rằng "Bật Chế độ cá nhân" đã được chọn. Ngoài ra, lưu ý rằng phiên bản trình biên dịch Solidity đã chọn là

“ version:0.4.24 +commit.e67f0147.Emscripten.clang ”。

Hai chi tiết này rất quan trọng, nếu không bạn sẽ không thể xem mã byte được thảo luận trong bài viết này.

Tiếp theo, bạn có thể đi tới tùy chọn Biên dịch và nhấp vào nút Chi tiết, và bạn sẽ thấy một cửa sổ bật lên có mọi thứ được tạo bởi trình biên dịch Solidity, một trong số đó là đối tượng JSON có tên BYTECODE, có thuộc tính "đối tượng", nó là mã hợp đồng được biên dịch và mã của nó như sau:

608060405234801561001057600080fd5b5060405160208061021783398101604090815290516000818155338152600160205291909120556101d1806100466000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600073ffffffffffffffffffffffffffffffffffffffff8316151561014757600080fd5b3360009081526001602052604090205482111561016357600080fd5b503360009081526001602081905260408083208054859003905573ffffffffffffffffffffffffffffffffffffffff85168352909120805483019055929150505600a165627a7a72305820a5d999f4459642872a29be93a490575d345e40fc91a7cccb2cf29c88bcdaf3be0029

tiêu đề cấp đầu tiên


triển khai hợp đồng

Tiếp theo, đến phần Run trong Remix. Trước tiên, hãy đảm bảo rằng bạn đang sử dụng máy ảo Javascript. Về cơ bản, đây là một mạng Javascript EVM + nhúng, nền tảng đào tạo Ethereum lý tưởng. Đảm bảo BasicToken được chọn trong ComboBox và nhập số 10000 vào hộp nhập Deploy. Tiếp theo, nhấp vào nút "Triển khai" để triển khai. Điều này triển khai một phiên bản của hợp đồng thông minh BasicToken mà chúng tôi đã tạo, với nguồn cung cấp ban đầu là 10.000 mã thông báo thuộc sở hữu của tài khoản hiện được chọn ở đầu tài khoản ComboBox, tài khoản này chứa tất cả nguồn cung cấp mã thông báo mà chúng tôi đã đặt.

Trong "Hợp đồng đã triển khai" của tab "Chạy", bạn có thể thấy hợp đồng thông minh đã triển khai, chứa ba trường để tương tác với hợp đồng: chuyển nhượng, cân bằng và tổng cung. Tại đây, chúng tôi có thể tương tác với phiên bản hợp đồng thông minh mà chúng tôi vừa triển khai.

Nhưng trước đó, chúng ta hãy xem "Triển khai" của một hợp đồng thực sự có nghĩa là gì:

Trong khu vực bảng điều khiển ở cuối trang, bạn có thể thấy nhật ký "việc tạo BasicToken đang chờ xử lý..." theo sau là mục nhập giao dịch với nhiều trường khác nhau: từ, đến, giá trị, dữ liệu, nhật ký và hàm băm. Nhấp vào mục nhập này để mở rộng thông tin giao dịch và bạn sẽ thấy ngày, đầu vào và mã byte của giao dịch mà chúng tôi đã đề cập ở trên. Vì vậy, hãy tạo một phiên bản hợp đồng thông minh, sẽ chứa địa chỉ và mã của chính nó.

tiêu đề cấp đầu tiên


tháo rời mã byte

Ở giữa bảng điều khiển, bên phải hộp giao dịch, có nút "gỡ lỗi". Nhấp vào nút này và bạn sẽ kích hoạt tùy chọn Debugger ở khu vực bên phải của Remix. Chúng ta có thể cùng nhau xem phần Hướng dẫn, nếu cuộn xuống sẽ xuất hiện như sau:

000 PUSH1 80

002 PUSH1 40

004 MSTORE

005 CALLVALUE

006 DUP1

007 ISZERO

008 PUSH2 0010

011 JUMPI

012 PUSH1 00

014 DUP1

015 REVERT

016 JUMPDEST

017 POP

018 PUSH1 40

020 MLOAD

021 PUSH1 20

023 DUP1

024 PUSH2 0217

027 DUP4

028 CODECOPY

029 DUP2

030 ADD

031 PUSH1 40

033 SWAP1

034 DUP2

035 MSTORE

036 SWAP1

037 MLOAD

038 PUSH1 00

040 DUP2

041 DUP2

042 SSTORE

043 CALLER

044 DUP2

045 MSTORE

046 PUSH1 01

048 PUSH1 20

050 MSTORE

051 SWAP2

...(viết tắt)

Để chắc chắn rằng bạn không làm sai, hãy so sánh những gì bạn thấy trong trình biên dịch Remix mà bạn đang chạy với phần trên.

Đây thực sự là mã byte được phân tách của hợp đồng. Nếu bạn quét mã byte thô theo từng byte (hai ký tự cùng một lúc), EVM sẽ nhận dạng một mã hành động cụ thể được liên kết với một thao tác cụ thể. Ví dụ:

0x60 => PUSH

0x01 => ADD

0x02 => MUL

0x00 => STOP

...

tiêu đề cấp đầu tiên


Opcode

Trước khi bắt đầu giải cấu trúc mã hợp đồng thông minh, bạn sẽ cần một bộ công cụ cơ bản để hiểu một mã lệnh duy nhất, chẳng hạn như mã lệnh của PUSH, ADD, SWAP, DUP, v.v. Cuối cùng, mỗi thao tác chỉ có thể được truy cập từ ngăn xếp của EVM , bộ nhớ hoặc thuộc về Đẩy một vật phẩm hoặc tiêu thụ một vật phẩm từ kho lưu trữ của hợp đồng.

Để xem tất cả các opcode khả dụng mà EVM có thể xử lý, bạn có thể kiểm tra Pyethereum, hiển thị danh sách các opcode. Để hiểu cách hoạt động của từng opcode, tài liệu lắp ráp chính thức của Solidity cũng là một tài liệu tham khảo tốt. Mặc dù nó không phải là sự tương ứng một-một với các opcode thô, nhưng nó khá gần (nó thực sự là Yul, một ngôn ngữ trung gian giữa mã byte Solidity và EVM). Nếu bạn có thể đọc các tài liệu kỹ thuật, bạn có thể đọc Ethereum Yellow Paper, trên thực tế, tất cả đều gói gọn trong nội dung trên.

Mặc dù có rất nhiều tài liệu được đề xuất cho mọi người, nhưng bây giờ không có ích gì khi đọc từ đầu đến cuối các tài nguyên này, chỉ cần nhớ rằng có những tài liệu như vậy và chúng tôi sẽ sử dụng chúng khi cần.

chỉ dẫn

Mỗi dòng trong phần tháo gỡ ở trên là một lệnh thao tác được thực thi bởi EVM. Mỗi lệnh chứa một mã lệnh. Ví dụ: chúng ta hãy lấy một trong các lệnh, lệnh 88, lệnh này đẩy số 4 vào ngăn xếp. Trình phân tách cụ thể này giải thích như sau:

88 PUSH1 0x04

| | |

| | Hex value for push.

| Opcode

Instruction number

Chiến lược


Chiến lược

Bất kỳ nhiệm vụ nào ban đầu dường như là không thể thực sự có thể được chia thành các nhiệm vụ có thể giải quyết được thông qua việc tháo dỡ liên tục và các vấn đề chúng tôi gặp phải cũng không ngoại lệ. Đối mặt với vấn đề này, chiến lược tôi áp dụng là "chia để trị".

Chúng ta có thể thử tìm các điểm phân nhánh của mã đã phân tách và dần dần chia nhỏ nó cho đến khi nó chia thành các phần rất nhỏ, điều mà chúng ta sẽ thực hiện từng bước trong trình gỡ lỗi của Remix.

Trong hình ảnh bên dưới, chúng ta có thể thấy đoạn mã được phân tách đầu tiên của chúng ta (mà tôi sẽ phân tích đầy đủ trong bài đăng tiếp theo).


Bảo mật chuỗi khối Cheetah dựa trên công nghệ của Kingsoft Internet Security, kết hợp với trí tuệ nhân tạo, nlp và các công nghệ khác, để cung cấp cho người dùng chuỗi khối các dịch vụ bảo mật sinh thái như kiểm toán hợp đồng và phân tích tình cảm.

*Bài viết này được xuất bản lần đầu trên phương tiện bởi Alejandro Santander, được dịch và tổ chức bởi Cheetah Blockchain*

Bảo mật chuỗi khối Cheetah dựa trên công nghệ của Kingsoft Internet Security, kết hợp với trí tuệ nhân tạo, nlp và các công nghệ khác, để cung cấp cho người dùng chuỗi khối các dịch vụ bảo mật sinh thái như kiểm toán hợp đồng và phân tích tình cảm.

Bạn có thể truy cập trang web chính thức của Ratingtokentìm hiểu thêm


猎豹区块链安全
作者文库