Как я могу вернуть массив целых чисел из функции программы ржавчины 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