tek4

Xây Dựng Smart Contract Blockchain – Hợp Đồng Thông Minh

by - September. 26, 2021
Kiến thức
<blockquote> <p>Trong b&agrave;i viết trước <a href="https://tek4.vn/" target="_blank" rel="noopener">Tek4.vn</a> đ&atilde; c&ugrave;ng c&aacute;c bạn t&igrave;m hiểu sơ lược về một <a href="https://tek4.vn/?p=8551&amp;preview=true" target="_blank" rel="noopener">Smart Contract</a>, trong b&agrave;i viết n&agrave;y ch&uacute;ng ta sẽ c&ugrave;ng x&acirc;y dựng Smart Contract của ri&ecirc;ng m&igrave;nh tr&ecirc;n nền tảng Ethereum blockchain. Bởi v&igrave; hợp đồng th&ocirc;ng minh l&agrave; chương tr&igrave;nh m&aacute;y t&iacute;nh cốt l&otilde;i của ch&uacute;ng, nhiều kh&aacute;i niệm m&agrave; ch&uacute;ng ta sẽ sử dụng để x&acirc;y dựng Smart Contract cơ bản sẽ c&oacute; vẻ quen thuộc. Những tiến bộ lớn trong c&ocirc;ng cụ d&agrave;nh cho nh&agrave; ph&aacute;t triển v&agrave; cơ sở hạ tầng trong hệ sinh th&aacute;i Ethereum cho ph&eacute;p ch&uacute;ng t&ocirc;i ph&aacute;t triển hiệu quả hợp đồng th&ocirc;ng minh ho&agrave;n to&agrave;n trong tr&igrave;nh duyệt, v&igrave; vậy bắt đầu th&ocirc;i!</p> </blockquote> <p><img class="aligncenter size-full wp-image-8552" src="https://tek4.vn/wp-content/uploads/2021/02/sm.png" alt="X&acirc;y dựng Smart Contract" width="1113" height="579" /></p> <h3><strong>Remixing Solidity</strong></h3> <p>M&aacute;y ảo Ethereum l&agrave; sự kết hợp của một hệ điều h&agrave;nh nhẹ v&agrave; một m&aacute;y trạng th&aacute;i, được x&acirc;y dựng nhằm mục đ&iacute;ch hiểu v&agrave; thực thi c&aacute;c hợp đồng th&ocirc;ng minh Ethereum. M&aacute;y ảo n&agrave;y, thường được gọi l&agrave; &ldquo;EVM&rdquo;, được vận chuyển v&agrave; nh&uacute;ng v&agrave;o mọi n&uacute;t Ethereum tạo n&ecirc;n mạng của n&oacute;. Chương tr&igrave;nh hợp đồng th&ocirc;ng minh Ethereum l&agrave; một loạt c&aacute;c hướng dẫn cấp m&aacute;y được EVM hiểu.</p> <p><a href="https://solidity.readthedocs.io/en/v0.6.6/" target="_blank" rel="noreferrer noopener">Solidity</a> l&agrave; một ng&ocirc;n ngữ lập tr&igrave;nh ch&iacute;nh thức, cấp cao được sử dụng để x&acirc;y dựng Smart Contract Ethereum. EVM kh&ocirc;ng hiểu một c&aacute;ch hữu cơ m&atilde; Solidity; Thay v&agrave;o đ&oacute;, Solidity đi k&egrave;m với tr&igrave;nh bi&ecirc;n dịch của ri&ecirc;ng m&igrave;nh để dịch m&atilde; nguồn Solidity m&agrave; con người c&oacute; thể đọc được th&agrave;nh m&atilde; bytecode tương th&iacute;ch EVM mức thấp. Solidity l&agrave; một ng&ocirc;n ngữ ho&agrave;n chỉnh của Turing được lấy cảm hứng từ cả c&uacute; ph&aacute;p v&agrave; ngữ nghĩa bởi C ++, Python v&agrave; JavaScript. N&oacute; hướng đối tượng v&agrave; thể hiện một hệ thống g&otilde; tĩnh biểu cảm, v&agrave; n&oacute; đ&uacute;ng với c&aacute;c kh&aacute;i niệm hướng đối tượng cơ bản như đ&oacute;ng g&oacute;i, kế thừa v&agrave; đa h&igrave;nh. Thực tế l&agrave; Solidity hỗ trợ kế thừa đ&atilde; l&agrave;m ph&aacute;t sinh một hệ sinh th&aacute;i phong ph&uacute; gồm c&aacute;c thư viện tiện &iacute;ch hợp đồng, c&aacute;c hợp đồng cơ sở được thiết kế để mở rộng v&agrave; chức năng m&ocirc;-đun kh&aacute;c để hỗ trợ tạo hợp đồng.</p> <p><a href="https://remix.ethereum.org/" target="_blank" rel="noreferrer noopener">Remix</a> l&agrave; một m&ocirc;i trường ph&aacute;t triển dựa tr&ecirc;n web để x&acirc;y dựng Smart Contract. N&oacute; cung cấp khả năng nhanh ch&oacute;ng tạo mẫu c&aacute;c hợp đồng th&ocirc;ng minh dựa tr&ecirc;n Solidity m&agrave; kh&ocirc;ng cần thiết lập bất kỳ c&ocirc;ng cụ cục bộ n&agrave;o v&agrave; n&oacute; giảm thiểu nhu cầu sử dụng ETH thực để triển khai v&agrave; thử nghiệm chức năng hợp đồng th&ocirc;ng minh.</p> <p><strong>Để bắt đầu, h&atilde;y l&agrave;m theo c&aacute;c bước b&ecirc;n dưới để mở Remix v&agrave; tạo tệp hợp đồng mới.</strong></p> <ol> <li>Truy cập <a href="https://remix.ethereum.org/" target="_blank" rel="noopener">remix.ethereum.org</a>.</li> <li>Chọn m&ocirc;i trường Solidity.</li> <li>Tạo một tệp mới c&oacute; t&ecirc;n <code>CellSubscription.sol</code>.</li> </ol> <h3><strong>Hướng dẫn: Hợp đồng điện thoại di động</strong></h3> <p>Ngữ nghĩa v&agrave; sự phức tạp của c&aacute;c ng&ocirc;n ngữ lập tr&igrave;nh phi tập trung trở n&ecirc;n r&otilde; r&agrave;ng hơn nhiều trong thực tế, v&igrave; vậy h&atilde;y sử dụng Solidity để x&acirc;y dựng một hợp đồng th&ocirc;ng minh Ethereum cơ bản. Hợp đồng của ch&uacute;ng ta sẽ rất th&ocirc; sơ v&agrave; sẽ hệ thống h&oacute;a giao thức của một hợp đồng điện thoại di động rất đơn giản giữa một c&ocirc;ng ty di động v&agrave; một thu&ecirc; bao.</p> <p>&nbsp;</p> <h4><strong>Tạo một </strong><strong>contract class</strong></h4> <p>Bước đầu ti&ecirc;n trong việc soạn thảo hợp đồng điện thoại di động l&yacute; thuyết của ch&uacute;ng ta l&agrave; x&aacute;c định ch&iacute;nh hợp đồng.</p> <pre class="lang:default decode:true ">pragma solidity &gt;=0.4.22 &lt;0.7.0; contract CellSubscription { }</pre> <p>Trong Solidity, contract l&agrave; c&ocirc;ng d&acirc;n ng&ocirc;n ngữ hạng nhất, c&oacute; cấu tr&uacute;c tương tự với lớp truyền thống: n&oacute; chứa một tập hợp c&aacute;c chức năng v&agrave; kh&aacute;i niệm về trạng th&aacute;i b&ecirc;n trong. Trong đoạn m&atilde; tr&ecirc;n, ch&uacute;ng ta cũng chỉ định rằng m&atilde; nguồn tu&acirc;n theo tương th&iacute;ch với phi&ecirc;n bản Solidity lớn hơn 0,5.10.</p> <h4><strong>Thiết lập trạng th&aacute;i nội bộ</strong></h4> <p>B&acirc;y giờ ch&uacute;ng ta đ&atilde; x&aacute;c định cấu tr&uacute;c của ch&iacute;nh hợp đồng, h&atilde;y bắt đầu bằng c&aacute;ch th&ecirc;m một h&agrave;m khởi tạo. Tương tự như c&aacute;c chương tr&igrave;nh truyền thống, c&aacute;c tr&igrave;nh tạo hợp đồng Solidity chỉ được gọi ngay sau khi triển khai hợp đồng v&agrave; kh&ocirc;ng thể được gọi lại sau đ&oacute;.</p> <pre class="lang:default decode:true ">pragma solidity &gt;=0.4.22 &lt;0.7.0; contract CellSubscription { uint256 monthlyCost; constructor(uint256 cost) public { monthlyCost = cost; } }</pre> <p>Rất nhiều c&uacute; ph&aacute;p mới đ&atilde; được giới thiệu rất nhanh ch&oacute;ng, v&igrave; vậy h&atilde;y ph&acirc;n t&iacute;ch đoạn m&atilde; ở tr&ecirc;n theo từng c&acirc;u lệnh.</p> <p>Đầu ti&ecirc;n, ch&uacute;ng ta khai b&aacute;o một biến th&agrave;nh vi&ecirc;n monthlyCost tr&ecirc;n ch&iacute;nh hợp đồng với kiểu uint256, nghĩa l&agrave; đ&acirc;y l&agrave; một số nguy&ecirc;n kh&ocirc;ng dấu c&oacute; k&iacute;ch thước tối đa 256 bit.</p> <p>Sau đ&oacute;, ch&uacute;ng ta sẽ sử dụng biến monthly cost n&agrave;y khi x&aacute;c định xem người đăng k&yacute; di động đ&atilde; thanh to&aacute;n đầy đủ hợp đồng của họ hay chưa.</p> <p>Tiếp theo, ch&uacute;ng t&ocirc;i x&aacute;c định một h&agrave;m khởi tạo v&agrave; đặt khả năng hiển thị của n&oacute; th&agrave;nh c&ocirc;ng khai bằng c&aacute;ch sử dụng c&ocirc;ng cụ sửa đổi khả năng hiển thị của h&agrave;m. C&aacute;c h&agrave;m v&agrave; c&aacute;c biến th&agrave;nh vi&ecirc;n c&oacute; thể giả định bốn tầm nh&igrave;n kh&aacute;c nhau trong Solidity: <code>public</code>,&nbsp;<code>private</code>,&nbsp;<code>internal</code>&nbsp;v&agrave; <code>external</code>.</p> <p>Cuối c&ugrave;ng, ch&uacute;ng ta khởi tạo biến th&agrave;nh vi&ecirc;n monthlyCost với đối số cost được truyền v&agrave;o h&agrave;m tạo.</p> <h4><strong>Th&ecirc;m chức năng người đăng k&yacute;</strong></h4> <p>Cho đến nay, ch&uacute;ng ta đ&atilde; x&aacute;c định cấu tr&uacute;c hợp đồng ban đầu v&agrave; trạng th&aacute;i hợp đồng nội bộ được khởi tạo. H&atilde;y xem x&eacute;t logic đăng k&yacute; thực tế m&agrave; ch&uacute;ng ta đang cố gắng x&acirc;y dựng.&nbsp;V&igrave; mục đ&iacute;ch đơn giản, chức năng của &ldquo;đăng k&yacute; điện thoại di động&rdquo; n&agrave;y sẽ được chuyển tiếp: người đăng k&yacute; trả một khoản ph&iacute; h&agrave;ng th&aacute;ng bằng ether cho hợp đồng v&agrave; c&ocirc;ng ty điện thoại di động c&oacute; thể kiểm tra xem t&agrave;i khoản đ&atilde; được thanh to&aacute;n đầy đủ chưa. B&acirc;y giờ ch&uacute;ng ta h&atilde;y m&atilde; h&oacute;a ph&acirc;n t&iacute;ch logic của người đăng k&yacute;, tức l&agrave; khả năng thanh to&aacute;n h&agrave;ng th&aacute;ng cho hợp đồng.</p> <pre class="lang:default decode:true ">pragma solidity &gt;=0.4.22 &lt;0.7.0; contract CellSubscription { uint256 monthlyCost; constructor(uint256 cost) public { monthlyCost = cost; } function makePayment() payable public { } }</pre> <p>Ethereum smart contract hoạt động như v&iacute; theo mặc định, c&oacute; nghĩa l&agrave; ch&uacute;ng c&oacute; thể gửi, nhận v&agrave; lưu trữ ether giống như một địa chỉ v&iacute; th&ocirc;ng thường. Kh&aacute;i niệm t&iacute;ch hợp về gi&aacute; trị nắm giữ hợp đồng n&agrave;y l&agrave;m cho ch&uacute;ng đặc biệt hữu &iacute;ch cho một thỏa thuận dựa tr&ecirc;n tiền tệ như thỏa thuận n&agrave;y. Trong đoạn m&atilde; tr&ecirc;n, ch&uacute;ng ta định nghĩa một h&agrave;m makePayment c&ocirc;ng khai mới cho ph&eacute;p người đăng k&yacute; thực hiện thanh to&aacute;n cho t&agrave;i khoản của họ. C&ocirc;ng cụ sửa đổi h&agrave;m payable cho hợp đồng tự động lưu trữ bất kỳ ETH n&agrave;o trong nội bộ được gửi khi gọi h&agrave;m makePayment, ch&uacute;ng t&ocirc;i sẽ sử dụng h&agrave;m n&agrave;y sau để x&aacute;c định xem người đăng k&yacute; đ&atilde; thanh to&aacute;n đủ ether v&agrave;o một ng&agrave;y nhất định hay chưa. Lưu &yacute; rằng h&agrave;m ho&agrave;n to&agrave;n kh&ocirc;ng c&oacute; phần th&acirc;n; Việc lưu trữ ether đ&atilde; gửi l&agrave; tự động khi c&oacute; c&ocirc;ng cụ sửa đổi payable. Nếu muốn, logic x&aacute;c thực phức tạp c&oacute; thể được th&ecirc;m v&agrave;o th&acirc;n h&agrave;m, v&iacute; dụ: Để từ chối thanh to&aacute;n từng phần.</p> <h4><strong>Th&ecirc;m chức năng của c&ocirc;ng ty</strong></h4> <p>Tại thời điểm n&agrave;y, ch&uacute;ng ta c&oacute; một hợp đồng c&oacute; thể được triển khai với chi ph&iacute; h&agrave;ng th&aacute;ng đ&atilde; thiết lập v&agrave; chấp nhận thanh to&aacute;n h&oacute;a đơn ether từ người đăng k&yacute;. Tiếp theo, ch&uacute;ng ta cần th&ecirc;m chức năng cho ph&eacute;p c&ocirc;ng ty điện thoại di động kiểm tra trạng th&aacute;i của t&agrave;i khoản v&agrave;o một ng&agrave;y nhất định.</p> <pre class="lang:default decode:true ">pragma solidity &gt;=0.4.22 &lt;0.7.0; contract CellSubscription { uint256 monthlyCost; constructor(uint256 cost) public { monthlyCost = cost; } function makePayment() payable public { } function isBalanceCurrent(uint256 monthsElapsed) public view returns (bool) { return monthlyCost * monthsElapsed &gt;= address(this).balance; } }</pre> <p>Ch&uacute;ng ta định nghĩa một h&agrave;m c&ocirc;ng khai kh&aacute;c được gọi l&agrave; isBalanceCurrent chấp nhận tham số monthsElapsed được nhập dưới dạng số nguy&ecirc;n kh&ocirc;ng dấu. C&ocirc;ng ty điện thoại di động c&oacute; thể gọi chức năng đơn giản n&agrave;y v&agrave; vượt qua một số th&aacute;ng tr&ocirc;i qua nhất định để x&aacute;c định trạng th&aacute;i t&agrave;i khoản của người đăng k&yacute; tại một thời điểm. H&agrave;m view được sử dụng để chỉ ra rằng chức năng n&agrave;y kh&ocirc;ng sửa đổi trạng th&aacute;i b&ecirc;n trong v&agrave; chỉ được đọc. Mệnh đề return (bool) thực hiện những g&igrave; n&oacute; ngụ &yacute; v&agrave; chỉ ra rằng một gi&aacute; trị true hoặc false sẽ được trả về. Trong ch&iacute;nh nội dung h&agrave;m, ch&uacute;ng ta thực hiện logic số học đơn giản để x&aacute;c định tổng số tiền đ&aacute;ng lẽ phải được thanh to&aacute;n v&agrave; ch&uacute;ng ta so s&aacute;nh số tiền đ&oacute; với số dư ether nội bộ của hợp đồng sử dụng <code>address(this).balance</code>. Cũng giống như c&aacute;c ng&ocirc;n ngữ kh&aacute;c, điều n&agrave;y đề cập đến phi&ecirc;n bản hợp đồng hiện tại đang được thực thi. C&acirc;u lệnh <code>address(...)</code>&nbsp; l&agrave; một h&agrave;m to&agrave;n cục chấp nhận một thể hiện hợp đồng v&agrave; trả về một thể hiện địa chỉ, v&igrave; vậy &nbsp;<code>address(this)</code> l&agrave; viết tắt để truy cập v&agrave;o thể hiện của địa chỉ hiện tại. Cuối c&ugrave;ng, tất cả c&aacute;c bản sao địa chỉ hợp đồng trong Solidity cũng hiển thị một biến <code>balance</code>đề cập đến lượng ether hiện được lưu trữ nội bộ. Điều n&agrave;y c&oacute; nghĩa l&agrave; trong phần th&acirc;n h&agrave;m tr&ecirc;n, nếu t&agrave;i khoản c&oacute; đủ ether dựa tr&ecirc;n số th&aacute;ng đ&atilde; tr&ocirc;i qua, n&oacute; sẽ trả về true, ngược lại sẽ trả về false.</p> <p>Ch&uacute;ng ta vẫn thiếu một chức năng quan trọng li&ecirc;n quan đến c&ocirc;ng ty: khả năng r&uacute;t tiền từ hợp đồng để ch&uacute;ng c&oacute; thể được chuyển v&agrave;o t&agrave;i khoản của ch&iacute;nh c&ocirc;ng ty. Rất may, Solidity cho thấy nhiều ngữ nghĩa tiện lợi hơn để r&uacute;t gi&aacute; trị từ t&agrave;i khoản hợp đồng.</p> <pre class="lang:default decode:true ">pragma solidity &gt;=0.4.22 &lt;0.7.0; contract CellSubscription { uint256 monthlyCost; constructor(uint256 cost) public { monthlyCost = cost; } function makePayment() payable public { } function withdrawBalance() public { msg.sender.transfer(address(this).balance); } function isBalanceCurrent(uint256 monthsElapsed) public view returns (bool) { return monthlyCost * monthsElapsed == address(this).balance; } }</pre> <p>Ch&uacute;ng t&ocirc;i th&ecirc;m một chức năng c&ocirc;ng khai cuối c&ugrave;ng được gọi l&agrave; &nbsp;<code>withdrawBalance,</code> cho ph&eacute;p t&agrave;i khoản được l&agrave;m trống. Phần th&acirc;n h&agrave;m sử dụng đối tượng msg chung đề cập đến tải trọng giao dịch đến cuối c&ugrave;ng. Trong v&iacute; dụ cơ bản v&agrave; kh&ocirc;ng an to&agrave;n n&agrave;y, to&agrave;n bộ số dư t&agrave;i khoản được chuyển đến người gọi <code>withdrawBalance</code>&nbsp; bằng c&aacute;ch sử dụng h&agrave;m &nbsp;<code>msg.sender.transfer</code> để gửi ether đến t&agrave;i khoản của người gửi. Ch&uacute;ng ta lại sử dụng &nbsp;<code>address(this).balance</code>&nbsp; để truy cập ether nội bộ được lưu trữ, sử dụng đ&acirc;y l&agrave; số tiền ch&uacute;ng t&ocirc;i muốn r&uacute;t.</p> <h4><strong>Bi&ecirc;n dịch v&agrave; chạy</strong></h4> <p>B&acirc;y giờ ch&uacute;ng t&ocirc;i c&oacute; một hợp đồng th&ocirc;ng minh c&oacute; thể được triển khai cho Ethereum blockchain, h&atilde;y sử dụng m&aacute;y ảo t&iacute;ch hợp của Solidity để m&ocirc; phỏng việc chạy hợp đồng n&agrave;y tr&ecirc;n mạng Ethereum ch&iacute;nh.</p> <ol> <li>Lưu hợp đồng của bạn bằng c&aacute;ch sử dụng &lt;strong&gt; ⌘ &lt;/strong&gt; + S hoặc Ctrl + S t&ugrave;y thuộc v&agrave;o hệ điều h&agrave;nh của bạn.</li> <li>Chuyển sang deployment tab. <img class="aligncenter size-full wp-image-8591" src="https://tek4.vn/wp-content/uploads/2021/02/pasted-image-0.png" alt="" width="900" height="280" /></li> <li>X&aacute;c định chi ph&iacute; h&agrave;ng th&aacute;ng sẽ được chuyển cho h&agrave;m tạo v&agrave; nhấp deploy. <img class="aligncenter size-full wp-image-8592" src="https://tek4.vn/wp-content/uploads/2021/02/pasted-image-0-1.png" alt="" width="900" height="280" /></li> <li>Định cấu h&igrave;nh gi&aacute; trị ETH m&ocirc; phỏng l&agrave; 1000 wei v&agrave; gọi h&agrave;m makePayment. Điều n&agrave;y m&ocirc; phỏng một người đăng k&yacute; thực hiện thanh to&aacute;n của họ trong một th&aacute;ng nhất định. <img class="aligncenter size-full wp-image-8593" src="https://tek4.vn/wp-content/uploads/2021/02/pasted-image-0-2.png" alt="" width="900" height="280" /><img class="aligncenter size-full wp-image-8594" src="https://tek4.vn/wp-content/uploads/2021/02/pasted-image-0-3.png" alt="" width="899" height="280" /></li> <li>Cuối c&ugrave;ng, h&atilde;y gọi h&agrave;m isBalanceCurrent với 1 l&agrave; tham số monthsElapsed, nghĩa l&agrave; ch&uacute;ng ta đang kiểm tra số dư hiện tại sau một th&aacute;ng tr&ocirc;i qua. Bạn sẽ thấy 0: bool: true, cho biết số dư t&agrave;i khoản tr&ecirc;n thực tế hiện tại.<img class="aligncenter wp-image-8595 size-full" src="https://tek4.vn/wp-content/uploads/2021/02/pasted-image-0-4.png" alt="X&acirc;y dựng Smart Contract" width="900" height="280" /></li> </ol> <p>Mặc d&ugrave; c&oacute; vẻ như kh&ocirc;ng nhiều, nhưng hiện tại bạn đ&atilde; viết một hợp đồng th&ocirc;ng minh Ethereum th&ocirc; sơ c&oacute; thể được khởi tạo với trạng th&aacute;i, giữ, nhận v&agrave; ph&acirc;n phối gi&aacute; trị tiền tệ v&agrave; điều đ&oacute; cho thấy khả năng x&aacute;c định trạng th&aacute;i t&agrave;i khoản t&agrave;i ch&iacute;nh. Mặc d&ugrave; kh&ocirc;ng c&oacute; kh&aacute;i niệm n&agrave;o trong số n&agrave;y được triển khai với t&iacute;nh bảo mật hoặc t&iacute;nh ho&agrave;n chỉnh cần thiết cho việc sử dụng sản xuất, nhưng ch&uacute;ng chứng minh chức năng ch&iacute;nh cung cấp cho c&aacute;c hợp đồng th&ocirc;ng minh Ethereum sức mạnh của ch&uacute;ng.</p> <h3><strong>C&acirc;n nhắc trong thế giới thực</strong></h3> <p>Hướng dẫn ở tr&ecirc;n rất hữu &iacute;ch để giới thiệu c&aacute;c kh&aacute;i niệm Solidity v&agrave; hiển thị ch&uacute;ng trong thực tế, nhưng việc ph&aacute;t triển v&agrave; x&acirc;y dựng c&aacute;c smart contract trong thế giới thực được sử dụng trong c&aacute;c s&agrave;n giao dịch kinh doanh gi&aacute; trị cao đ&ograve;i hỏi phải lập kế hoạch v&agrave; c&acirc;n nhắc cẩn thận.</p> <p>Hợp đồng thu&ecirc; bao điện thoại di động cơ bản m&agrave; ch&uacute;ng ta đ&atilde; soạn thảo vốn kh&ocirc;ng an to&agrave;n v&agrave; c&oacute; thể được cải thiện rất nhiều. V&iacute; dụ: việc r&uacute;t tiền n&ecirc;n được giới hạn trong một tập hợp c&aacute;c địa chỉ người gửi được ph&ecirc; duyệt trước để ngăn người d&ugrave;ng t&ugrave;y tiện l&agrave;m trống t&agrave;i khoản. Như hiện tại, bất kỳ ai cũng c&oacute; thể gọi r&uacute;t tiền v&agrave; nhận tất cả ETH được lưu trữ trong hợp đồng. Hơn nữa, chức năng makePayment c&oacute; thể được tăng cường để x&aacute;c thực khoản thanh to&aacute;n đ&atilde; nhận nhằm ngăn chặn việc trả qu&aacute; nhiều hoặc trả thiếu v&agrave; người gửi c&oacute; thể được x&aacute;c minh l&agrave; từ một t&agrave;i khoản đ&atilde; biết, nếu muốn.</p> <p>Mặc d&ugrave; m&ocirc;i trường ph&aacute;t triển Remix rất tuyệt vời để tạo mẫu Hợp đồng th&ocirc;ng minh v&agrave; kiểm tra t&iacute;nh đ&uacute;ng đắn của Solidity, hầu hết c&aacute;c hợp đồng th&ocirc;ng minh trong thế giới thực sẽ được ph&aacute;t triển cục bộ bằng c&aacute;ch sử dụng c&ocirc;ng cụ x&acirc;y dựng phức tạp hơn như <a href="https://www.trufflesuite.com/" target="_blank" rel="noreferrer noopener">Truffle</a>. C&oacute; lẽ quan trọng nhất, <strong>n&oacute; tốn tiền thật dưới dạng ether để tương t&aacute;c với c&aacute;c hợp đồng th&ocirc;ng minh được triển khai tr&ecirc;n mạng Ethereum ch&iacute;nh</strong>. Đ&acirc;y l&agrave; do thiết kế v&agrave; tạo th&agrave;nh nền tảng cho sự tự cung tự cấp về kinh tế của Ethereum: chi ph&iacute; tiền để l&agrave;m bất cứ điều g&igrave; tr&ecirc;n mạng Ethereum trực tiếp. Rất may, Remix đ&atilde; bỏ qua sự phức tạp ban đầu n&agrave;y bằng c&aacute;ch tạo ra một EVM trong tr&igrave;nh duyệt, dựa tr&ecirc;n JavaScript bắt chước h&agrave;nh vi của EVM mạng thực. Tr&ecirc;n thực tế, c&aacute;c hợp đồng th&ocirc;ng minh sẽ được triển khai bằng c&aacute;ch sử dụng c&ocirc;ng cụ CLI do Node.js cung cấp th&ocirc;ng qua một khu&ocirc;n khổ như Truffle v&agrave; cả việc triển khai hợp đồng v&agrave; gọi h&agrave;m tr&ecirc;n ch&uacute;ng sẽ y&ecirc;u cầu t&agrave;i khoản Ethereum được cấp vốn bằng ether thực.</p> <h3>Kết luận</h3> <p>Việc thực h&agrave;nh c&aacute;c hợp đồng th&ocirc;ng minh đ&ograve;i hỏi cả kiến ​​thức lập tr&igrave;nh về ngữ nghĩa của Solidity v&agrave; kiến ​​thức về c&ocirc;ng cụ xung quanh cả Solidity v&agrave; Ethereum n&oacute;i chung. Mức độ m&agrave; c&aacute;c kh&aacute;i niệm được trừu tượng h&oacute;a v&agrave; trải nghiệm tổng thể của nh&agrave; ph&aacute;t triển Ethereum đều đ&atilde; được cải thiện trong những năm gần đ&acirc;y v&agrave; n&oacute; tiếp tục l&agrave;m như vậy với tốc độ nhanh ch&oacute;ng. Ethereum đ&atilde; tự khẳng định m&igrave;nh l&agrave; một nền tảng hợp đồng th&ocirc;ng minh trưởng th&agrave;nh với bộ t&iacute;nh năng ấn tượng v&agrave; sự ủng hộ mạnh mẽ của cộng đồng. C&acirc;u hỏi về việc liệu c&aacute;c doanh nghiệp c&oacute; mong muốn v&agrave; nhu cầu thực sự đối với c&aacute;c hợp đồng tự động như vậy hay kh&ocirc;ng vẫn c&ograve;n được xem x&eacute;t.</p> <p>B&agrave;i viết n&agrave;y đ&atilde; kết th&uacute;c phần nội dung kiến thức về smart contract blockchain, nếu bạn thấy hay th&igrave; nhớ like, share để ủng hộ cho đội ngũ của Tek4 bạn nh&eacute;!</p> <p>&nbsp;</p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p> <p>&nbsp;</p> <p>&nbsp;</p>