Как закодировать данные вызова в контракт - PullRequest
0 голосов
/ 06 января 2020

Читая исходный код рукописного ввода ( здесь ), я понимаю, что вызов по контракту - это селектор, объединенный с любыми аргументами функции.

Из теста модуля времени выполнения субстрата, Я использую конструктор CallData, который делает, как описано

let mut call = CallData::new( Selector::from_str("foo") );
call.push_arg(&0);

, а затем совершаю вызов через модуль фрейма контрактов

let res = <contracts::Module<Test>>::bare_call(      
    ALICE,                                                      
    contract_addr,                                                       
    0,                                                          
    100_000,                                                                                    
    //codec::Encode::encode(&call.to_bytes().to_vec()));        
    call.to_bytes().to_vec());                                  

Для подписи функции контракта

fn foo(&self, x: AccountId)

Возвращает успешное выполнение (Ok(())), но не вызывает функцию контракта.

Стоит сказать, что в тесте используется type AccountId = u64, а в чернилах используется struct AccountId([u8;32]), но я Я пытался передать как 32 байта, и это не имело значения.

Я проверил, что окружающий тестовый код должен работать, вызвав программу wasm, написанную на wat here , что может вызывать экспортированный «вызов» без передачи каких-либо параметров.

Полные репозитории также находятся на github для модуля и контракта .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...