Unexpected Behaviour Hex-Encoding Negative `BigInt`s

Đang mở
#4,222 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức phù hợp với người mới
25/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
rust
Lĩnh vực
api, blockchain

Hướng nghiên cứu

Bắt đầu bằng việc đọc triển khai của typeConversions.bigIntToHex trong HostExports và hành vi của num::BigInt::to_bytes_be. So sánh tài liệu tham chiếu về mã hóa go-ethereum với ba hành vi được đề xuất đối với các giá trị âm, sau đó xác định chính sách nào có thể chấp nhận được mà không làm hỏng khả năng tương thích của các hàm host. Hoàn tất khi hành vi và các ảnh hưởng đến khả năng tương thích đã được quyết định và được bao quát bởi các bài kiểm thử hoặc tài liệu liên quan.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

apiVersion area/runtime bug Stale

I would like to report some behaviour that seems unexpected to me.

What is the current behavior?

Encoding a negative BigInt value will return the hex of its absolute value. So -42 will be encoded as 0x2a.

What is the expected behavior?

Looking into the code, it looks like num::BigInt::to_bytes_be returns the big-endian bytes for its absolute value. This causes typeConversions.bigIntToHex to encode absolute values of its BigInt parameter.

This is a bit unexpected to me, and I would have expected either:

  1. To sign prefix the hex value (so 42 becomes 0x2a and -42 becomes -0x2a). This is more inline with how num::BigInt would hex-format values.
  2. To hex encode the value in 2's compliment notation. (so 42 becomes 0x2a and -42 becomes 0xd6). In looking at the code, this encoding implementation requires no leading 0s in the hex representation. This would mean that with 2's compliment, there would be multiple numbers with the same hex representation (for example 255 would be 0xff and -1 would also be 0xff).
  3. Disallow hex-encoding negative big integers. From the documentation for the typeConversions.bigIntToHex implementation in the HostExports, it mentions go-ethereum encoding rules as the reference. By those rules, hex marshalling for negative numbers is explicitly prohibited, so following that here would also make sense:

    Negative integers are not supported at this time. Attempting to marshal them will return an error. Values larger than 256bits are rejected by Unmarshal but will be marshaled without error.

Unfortunately, all of these suggestions would be breaking changes (which I imagine should be avoided for subgraph host function implementations).

Ngôn ngữ chính
Rust
Star
3.2k
Fork
1.1k
Merge trung bình
4 ngày 1 giờ
Pull request đã merge (30 ngày)
1

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của graphprotocol/graph-node

Tất cả issue của graphprotocol/graph-node

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.