Vyper Byte Arrays

whiteboard crypto logo
Published by:
Whiteboard Crypto
on

Byte Arrays are a prominent data type in Vyper that facilitates the storage of sequences of bytes. Check out these examples:

example_data: Bytes[50]

@external
def store_data(_data: Bytes[50]):
    self.example_data = _data

@external
def get_data() -> Bytes[50]: 
    return self.example_data


data: Bytes[100]

@external
def calculate_length(_data: Bytes[100]) -> int128:
    return len(_data)


@external
def concatenate_arrays(arr1: Bytes[100], arr2: Bytes[100]) -> Bytes[200]:
    # Concatenate two byte arrays
    return concat(arr1, arr2)

Wrapped with flexibility, byte arrays give you the power to dictate the maximum size for the array.

Throughout this article, we’ll sink our teeth into what byte arrays are, unpack some of the intricate details that define them, and cap it all off with some illustrative examples of byte arrays in action within Vyper smart contracts.

Overview of Byte Arrays

Byte arrays, symbolized as Bytes[maxLen] in Vyper, are a unique data type that can store a sequence of bytes. Here, maxLen is an integer that specifies the maximum size of the byte array. Byte arrays in vyper are dynamic, meaning the size they occupy can change over time, but cannot exceed the specified maximum length.

Unlike some programming languages where byte arrays are typically represented as an array of integers, in Vyper, byte arrays are represented through a unique Bytes keyword. This distinct representation is more intuitive, as it clearly signals that it’s handling byte data.

A notable feature in Vyper is the ability to declare a maximum size on byte arrays. This means you can set a limit on how much data a byte array can store, optimizing memory use and consequently potentially saving on gas costs.

Here’s a simple declaration of a byte array:

data: Bytes[100]

In this case, data is a byte array that can store up to 100 bytes of data.

Common Uses of Byte Arrays in Vyper

Byte Arrays are an incredibly flexible data type that come in handy in various scenarios. Here are a few:

  1. Storing Binary Data: Byte arrays excel at storing binary data. For instance, you could use a byte array to store a file’s binary data within a contract.
  2. Handling Arbitrary Length Data: If your contract needs to interact with data that doesn’t conform to a fixed length, a byte array would be the perfect fit. Byte arrays’ dynamic nature allows them to handle data with a variety of sizes, permitting efficient storage of such data.

Example 1: Storing and Retrieving Data

First up, a straightforward example – we store random data into a byte array, and then call it back.

example_data: Bytes[50]

@external
def store_data(_data: Bytes[50]):
    # Store data in the byte array
    self.example_data = _data

@external
def get_data() -> Bytes[50]: 
    # Retrieve the stored data
    return self.example_data

In this contract, store_data function accepts data of up to 50 bytes and stores it in the example_data byte array contract’s state. Next, the get_data function retrieves this stored data.

Example 2: Calculating Data Length

This example illustrates the function calculation of a byte array’s length.

data: Bytes[100]

@external
def calculate_length(_data: Bytes[100]) -> int128:
    # Calculate the length of data
    return len(_data)

Here, we’re taking in user-defined data up to 100 bytes through the calculate_length function, then returning the length of data using the len function.

Example 3: Concatenating Byte Arrays

Finally, we look at the concatenation of byte arrays.

@external
def concatenate_arrays(arr1: Bytes[100], arr2: Bytes[100]) -> Bytes[200]:
    # Concatenate two byte arrays
    return concat(arr1, arr2)

In this contract, concatenate_arrays accepts two Bytes[100] arrays and concatenates them using the concat function. It then returns a Bytes[200] array consisting of arr1 and arr2 concatenated.

Best Practices and Potential Pitfalls

While using Byte Arrays in Vyper, there are a few key points to keep in mind:

  1. Beware of Exceeding Maximum Length: When you’re interacting with byte arrays, be careful not to exceed the maximum length you defined when declaring the byte array. Any attempt to store data that exceeds this length would result in a runtime exception.
  2. Optimal Length Selection: Aim to select a maximum length that best suits your specific requirements. Overspecifying the length could result in unnecessary gas costs due to wasted storage space.
  3. Know Your Functions: Vyper provides several built-in functions for interacting with byte arrays, including len for getting the length, concat for concatenating arrays, and slice for extracting subarrays. Knowing how to use these can enhance your byte-juggling prowess.

The introduction to byte arrays ends here. But the journey to mastering this dynamic data type has only just begun. The more you play around with byte arrays, the more you’ll discover the different ways in which they can streamline and optimize your smart contracts. Happy coding in Vyper!

whiteboard crypto logo

WhiteboardCrypto is the #1 online resource for crypto education that explains topics of the cryptocurrency world using analogies, stories, and examples so that anyone can easily understand them. Growing to over 870,000 Youtube subscribers, the content has been shared around the world, played in public conferences and universities, and even in Congress.