Bản phát hành EthereumJS VM v5 | Blog của Ethereum Foundation

Rate this post

Trong khi mọi người đang nhìn chằm chằm vào sự ngạc nhiên vào ngày 1 tháng 12, 12 giờ đêm giờ UTC dự đoán nguồn gốc Beaconchain Eth 2.0, trong nhóm JavaScript, chúng tôi đã âm thầm chuẩn bị bản phát hành genesis nhỏ của riêng mình trong bóng tối. Chúng tôi cũng rất vui mừng về điều này. 😀

Một số câu chuyện cơ bản: EthereumJS hệ sinh thái xung quanh VM bao gồm một bộ thư viện rất mô-đun (vm, blockchain, merkle-Patricia-tree, tx, …), mỗi thư viện đóng gói bộ chức năng chuyên dụng của riêng nó. Mặc dù điều này là tuyệt vời cho người dùng, nhưng nó không phải là quá tốt cho sự phát triển vì nó thường trở nên cần thiết để thực hiện các thay đổi trên một số thư viện cùng một lúc, điều này rất khó và tốn thời gian để thực hiện theo cách duy trì tính nhất quán có các thư viện trong các kho khác nhau. Vì vậy, vào đầu năm nay, chúng tôi đã quyết định cập nhật thiết lập của mình và kết hợp các thư viện liên quan đến máy ảo trong một monorepo. Đây là một kho lưu trữ duy nhất, nơi có thể nhắm mục tiêu các thay đổi trên một số thư viện trong một yêu cầu kéo duy nhất và chạy tất cả các bộ thử nghiệm thư viện khác nhau cùng nhau để đảm bảo tính nhất quán. Đồng thời, lợi ích từ việc có nhiều gói được phát hành riêng lẻ.

Kể từ khi chuyển sang monorepo, hoạt động phát triển của chúng tôi đã bùng nổ theo đúng nghĩa đen. 😋 Chúng tôi đã khám phá ra rất nhiều điều muốn cải thiện mà chúng tôi không thể dừng lại, đặc biệt là vì một thay đổi này thường kích hoạt một thay đổi khác mà giờ đây chỉ là “quá rõ ràng để làm”. 😜

Vì vậy, chúng tôi đã phát triển. Và được phát triển. Và được phát triển. Về cơ bản là trong suốt cả năm. Đó là lý do chính tại sao bạn nghe được tương đối ít từ chúng tôi trong những tháng qua, chúng tôi quá bận rộn với tất cả những thứ này.

Trong khi vào cuối quá trình, đôi khi chúng tôi tự hỏi liệu chúng tôi có bao giờ kết hợp mọi thứ lại với nhau hay không (xem ghi chú phát hành rộng rãi của chúng tôi để hiểu ý tôi muốn nói), hôm nay tôi thực sự tự hào rằng cuối cùng tôi cũng có thể thông báo: chúng tôi đã làm nó. 😋 Cảm ơn một đội tuyệt vời vì tất cả những công việc tuyệt vời và tận tâm về vấn đề này. 🎉

Đây không phải là một mà là sáu bản phát hành chính trên các thư viện chính của chúng tôi với máy ảo của chúng tôi đi đầu:

Trong bài đăng này, chúng tôi sẽ không đi sâu vào các chi tiết kỹ thuật và thay vào đó đưa ra một cái nhìn tổng quan ở mức độ cao. Để có một bức tranh đầy đủ hơn, hãy xem các ghi chú phát hành được liên kết ở trên, chúng tôi thực sự quan tâm đến việc làm cho các ghi chú này trở nên bao gồm và dễ đọc cũng như cung cấp một cái nhìn tổng quan tốt về tất cả các thay đổi (vi phạm) có liên quan.

Có lẽ chỉ một lưu ý quan trọng: chúng tôi đã chuyển sang kế hoạch đặt tên mới cùng với các bản phát hành này và bạn cần sử dụng các tên mới để có các phiên bản mới. Trước đây ethereumjs-vm gói vd bây giờ cài đặt như sau:

npm install @ethereumjs/vm

Được. Thực sự có gì trong đó? Chúng ta hãy có một cái nhìn nhanh.

Tất cả Hardforks

Máy ảo EthereumJS v5 hiện hỗ trợ tất cả các hardforks trở lại genesis. Đây là phần mở đầu trong lịch sử của JavaScript Ethereum và chúng tôi hy vọng rằng điều này sẽ mở ra cho nhiều trường hợp sử dụng mới có tiềm năng thú vị. Chúng tôi đã có của riêng mình, nhiều hơn về điều này bên dưới.

Một máy ảo trên một HF cụ thể có thể được bắt đầu bằng:

import VM from '@ethereumjs/vm';
import Common from '@ethereumjs/common';

const common = new Common({ chain: 'mainnet', hardfork: 'spuriousDragon' });
const vm = new VM({ common });

Máy ảo tập trung vào EIP

Mặc dù các hardforks rất tuyệt vời khi kết hợp một tập hợp các thay đổi đã thống nhất lại với nhau, nhưng máy ảo tập trung vào hardfork đã hóa ra không đủ linh hoạt để cho phép phát triển theo định hướng trong tương lai, nơi mà nó chưa được hoàn thiện trong một thời gian khá lâu mà các EIP sẽ biến nó thành một hardfork mới (các Berlin hardfork dường như là ví dụ tốt nhất cho điều này).

Với bản phát hành VM mới, lớp mô-đun hóa chức năng bên trong đã được làm lại. Điều này cho phép các EIP hiện nay trở thành công dân bản địa trong VM. Một máy ảo với một bộ EIP đặc biệt có thể được khởi tạo như sau:

import Common from '@ethereumjs/common';
import VM from '@ethereumjs/vm';

const common = new Common({ chain: 'mainnet', eips: [2537] });
const vm = new VM({ common });

Với tư cách là người mới bắt đầu, chúng tôi hỗ trợ các EIP mới sau đây (chủ yếu được nhắm mục tiêu cho Berlin hardfork) với VM v5phóng thích:

TypeScript

Trong chu kỳ phát hành EthereumJS này, chúng tôi có thể tự tin nói rằng chúng tôi đã đưa các thư viện của mình lên một hệ thống công nghệ hiện đại. Một phần quan trọng của điều này: với các bản phát hành mới, chúng tôi đang hoàn thành kế hoạch từ lâu và thực hiện khi chuyển đổi TypeScript và tất cả các thư viện chính của chúng tôi cũng như các phụ thuộc nội bộ hiện được viết bằng TypeScript.

Đây chỉ là một đỉnh cao khiến TypeScript trở nên tuyệt vời và giúp làm cho các thư viện của chúng tôi mạnh mẽ và an toàn hơn: TypeScript là một tập hợp siêu JavaScript và cho các nhà phát triển biết các kiểu dữ liệu cho từng biến và từng đối tượng được sử dụng trong mã. Biến có được gọi là địa chỉ một chuỗi hoặc một nhị phân Đệm sự vật? Mặc dù bạn không nhận được gợi ý rõ ràng nào về điều này trong JavaScript – điều này làm tăng cao nguy cơ mắc các lỗi tiếp theo của nhà phát triển – trong TypeScript, bạn sẽ biết chắc chắn.

Nó cũng sẽ thú vị hơn rất nhiều khi làm việc trực tiếp trên các thư viện của chúng tôi hoặc sử dụng các thư viện trong một dự án của bên thứ ba vì với tư cách là nhà phát triển, giờ đây bạn có thể nhận được các gợi ý như thế này trong IDE trong toàn bộ cơ sở mã:

Môi trường phát triển của bạn với cách gõ TypeScript thích hợp giờ đây chỉ cần biết rằng chuỗi khối biến là một @ ethereumjs / blockchain đối tượng (giữ lại nhận xét của bạn, các nhà phát triển Go and Rust 😅) và không chỉ “cái gì đó”. Vì vậy, mã riêng của chúng tôi tương ứng với mã (TypeScript) của bạn sẽ dễ đọc hơn rất nhiều khi sử dụng các phiên bản thư viện mới.

Lời hứa

Nếu bạn không quá quan tâm đến JavaScript, bạn có thể bỏ qua phần này, nhưng nếu bạn là một nhà phát triển JavaScript, bạn có thể sẽ thở phào nhẹ nhõm về những tin tức này vì vậy ít nhất chúng tôi sẽ đề cập ngắn gọn đến vấn đề này:

Một quá trình chuyển đổi khác đã hoàn tất, tất cả các API thư viện hiện đang hoạt động với JavaScript Promises. Vì vậy, không còn gọi lại ở bất kỳ đâu trong toàn bộ ngăn xếp của chúng tôi.

Việc sử dụng thư viện thay đổi từ:

blockchain.getBlock(blockId, block => {
  console.log(block);
});

Ví dụ về API mới:

const block = await blockchain.getBlock(blockId);
console.log(block);

Việc thụt lề nhỏ trong ví dụ đầu tiên này có thể không có nhiều ý nghĩa ngay từ cái nhìn đầu tiên. Tuy nhiên, trên một số lệnh gọi kiểu cũ được lồng vào nhau, bạn ngày càng sâu hơn và tại một số thời điểm, mã trở nên không thể đọc được. Chỉ cần google “địa ngục gọi lại” nếu bạn quan tâm đến việc điều này có thể trông như thế nào. 🙂 Hứa hẹn cho phép viết mã dễ đọc hơn đáng kể.

Tái cấu trúc thư viện

Đôi khi hơi khó để tưởng tượng về sự cần thiết của việc thay đổi động cơ nếu xe vẫn đang chạy, tuy nhiên tại một số thời điểm, nó trở nên cần thiết nếu bạn muốn vượt qua 10.000 dặm tiếp theo một cách an toàn. Với việc tái cấu trúc trong phần mềm, nó thường hơi tương tự. 😀 Với loạt bài phát hành này, chúng tôi đã làm lại các nguyên tắc cơ bản của một số thư viện trung tâm nhất và khốicủa chúng tôi tx và một phần của chúng tôi chuỗi khối thư viện đã nhận được một bản viết lại đáng kể.

Bây giờ sẽ dễ dàng hơn rất nhiều để làm việc với các thư viện này và chúng nên được chuẩn bị tốt để cung cấp cơ sở vững chắc và an toàn được xây dựng trong hệ sinh thái Ethereum JavaScript trong những năm tới.

Quan điểm

Chúng tôi hy vọng rằng bạn thích bản phát hành mới của chúng tôi. Bài đăng này chỉ có thể cung cấp thông tin chi tiết về những thay đổi quan trọng nhất và mọi thứ được đề cập chi tiết hơn trong ghi chú phát hành được liên kết ở đầu bài đăng này. Chúng tôi rất vui khi nghe phản hồi của bạn về Bất hòa máy chủ hoặc mới của chúng tôi @EFJavaScript tài khoản Twitter.

Đối với bản thân chúng tôi, những bản phát hành này cung cấp một số nền tảng vững chắc để chuyển sang một chu kỳ phát triển có định hướng trong tương lai và chúng tôi rất háo hức mong được thấy điều này có hiệu lực. Với việc VM có tất cả các hardforks được triển khai, bây giờ có thể tích hợp VM vào Khách hàng EthereumJS dự án. Chúng tôi sẽ sớm tham gia mainnet với ứng dụng khách này. Nhưng chúng tôi vẫn sẽ có thể thực hiện những chia sẻ của mình để giúp cải thiện sự đa dạng của khách hàng. Khách hàng mới trong giai đoạn đầu tiên của nó sẽ cho phép chúng tôi tham gia các mạng thử nghiệm phát triển như Yolo v2 (và theo dõi) và tích cực giúp phát hiện và bảo vệ khỏi các lỗi đồng thuận giữa các khách hàng. Chúng tôi cũng sẽ có thể đóng góp tích cực hơn vào nghiên cứu giao thức trong tương lai và tham gia vào việc triển khai nghiên cứu sau cùng. Bạn sẽ nghe nhiều hơn về điều này sau khi chúng tôi có sẵn phiên bản khách hàng có thể sử dụng đầu tiên (nhắm mục tiêu fullsync trên Yolo v2), điều này sẽ là vào đầu năm sau.

Hiện tại, chúng tôi chúc mọi người có một ngày cuối năm đầy chiêm nghiệm được bổ sung bằng một ngày (tuần) ra mắt beaconchain thú vị! 🚀

Nhóm JavaScript EF

Thuc Quyen

Leave a Reply

Your email address will not be published. Required fields are marked *