Я пытаюсь работать с блокчейном Ethereum, с контрактами Solidity. В настоящее время я развертываю контракт и выполняю некоторые действия с ним, но мне хотелось бы знать, как получить некоторые «отзывы / обратные вызовы / возвраты» определенной транзакции.
Есть ли способ установить статустранзакция в 0 (ошибка) и по-прежнему получать события, например?
if (id.length <= 0) {
emit Result("KO", "1");
revert();
}
Это не будет работать (нет события), потому что я все отменить, но статус будет установлен в 0
if (id.length <= 0) {
emit Result("KO", "1");
return;
}
Я получу какое-то событие, но статус останется 1
if (id.length <= 0) {
revert("KO_1");
}
Статус будет 0, но у меня не будет никакого события
Вот мой код перехода навыполните действие:
func testFunction(id []byte) {
//...
//...
tx, err := instance.Action(opt, id)
if (errors.HasError(err)) {
return
}
callbackValue := subscribeToContract(tx.Hash().Hex())
logs.Pretty(tx, callbackValue)
//...
//...
}
func subscribeToContract(hashToRead string) myStruct {
query := ethereum.FilterQuery{
Addresses: []common.Address{address},
}
soc := make(chan types.Log)
sub, err := WssClient.SubscribeFilterLogs(context.Background(), query, soc)
if err != nil {
logs.Error(err)
}
for {
select {
case err := <-sub.Err():
logs.Info(`SOMETHING ERROR`)
logs.Error(err)
case vLog := <-soc:
logs.Info(`SOMETHING`)
contractAbi, _ := abi.JSON(strings.NewReader(string(SignABI)))
event := myStruct{}
contractAbi.Unpack(&event, "Result", vLog.Data)
logs.Info(`New Event from [` + vLog.TxHash.Hex() + `] : ` + event.Message)
}
}
}
Если id.length > 0
, все хорошо. Но если id.length <= 0
, у меня нет функции обратного вызова из функции subscribeToContract
.
Есть ли способ напрямую получить статус результата, или я должен зацикливаться с tx, err := client.TransactionReceipt(context.Background(), txHash)
до тех пор, пока не получу статус?