Фон:
Я пишу контракт, который наследуется 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
.
Как контракты защищены от внедрения неверных данных? Я ожидаю, что этот вопрос является результатом моего собственного непонимания того, как работают взаимодействия с оракулами!
Ваши предположения верны, он должен быть общедоступным, но в этом случае могут помочь модификаторы. ChainlinkClient имеет recordchainlinkfulfillment
модификатор для обратных вызовов выполнения.
Этот модификатор указывает, что только исходный оракул, который был вызван, может вызывать эту функцию, оракул, определенный при отправке запроса.
Ссылка: документы chainlink