Как я могу вернуть массив целых чисел из функции программы ржавчины Solana во внешний интерфейс?

Я не знаю, как я могу написать смарт-контракт в Солане, который после выполнения логики возвращает клиенту массив целых чисел, строк, ..., и как я могу получить его с помощью Web3?

2 ответа

Для сетевых программ доступен системный вызов , который помещает данные в буфер, который может быть прочитан программами более высокого уровня, использующими . Все это передается через непрозрачные буферы байтов, поэтому вам нужно знать, как декодировать ответ.

Если вы хотите получить данные со стороны клиента, вы можете смоделировать транзакцию и прочитать данные обратно из return_dataполе в ответе: https://edge.docs.solana.com/developing/clients/jsonrpc-api#results-50

Поддержка RPC в смоделированных транзакциях появилась впервые в версии 1.11, но возвращаемые данные доступны и в более ранних версиях.

Исходный код для set_return_dataна https://github.com/solana-labs/solana/blob/658752cda710cb358d7ccbbc2cee06bf8009c2d4/sdk/program/src/program.rs#L102

Исходный код для get_return_dataна https://github.com/solana-labs/solana/blob/658752cda710cb358d7ccbbc2cee06bf8009c2d4/sdk/program/src/program.rs#L117

Таким образом, программы не возвращают данные (кроме успеха или неудачи).

Однако; большинство программ записывают данные в учетную запись, принадлежащую программе dataполе, и его можно прочитать из клиентских приложений (Rust, Python, TS/JS и т. д.).

Если вы используете библиотеку Solana web3, вы можете вызвать getAccountInfoна Connectionобъект. Это вернет массив байтов учетной записи. Затем вам нужно будет deserializeэти данные. Вы должны знать, как программа serializesданные, чтобы отменить его успешно.

Проверьте поваренную книгу Solana для обзора, используя borsh https://solanacookbook.com/guides/serialization.html#how-to-deserialize-account-data-on-the-client