Как я могу защитить свой метод выполнения оракула Chainlink?

Фон:

Я пишу контракт, который наследуется ChainlinkClient, чтобы сделать запрос API через задание оракула:

function fetch() private returns (bytes32 requestId) {
    Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
    request.add("get", ...);
    return sendChainlinkRequestTo(oracle, request, fee);
}

function fulfill(bytes32 _requestId, uint256 _result) public recordChainlinkFulfillment(_requestId) {
    // Rely on returned data
}

Предположения:

  • При выполнении запроса оракула fulfillметод должен быть public.
  • publicметоды могут быть доступны из любого другого контракта.

Вопрос:

Что мешает кому-то вручную вызвать fulfillметод? Это важно, потому что контракт зависит от данных, введенных в файлы fulfill.

Как контракты защищены от внедрения неверных данных? Я ожидаю, что этот вопрос является результатом моего собственного непонимания того, как работают взаимодействия с оракулами!

Ответы (1)

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

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

Ссылка: документы chainlink