我正在尝试设置本地 Chainlink 节点来执行任务。请求正在正确执行,但由于未保存获取的数据,因此似乎未调用执行函数。
即使最后一步被标记为暂停(我不知道这是否是我的问题的原因)。下一次执行代码后,它就完成了。我尝试将 minIncomingConfirmations 设置为 0,但它不断被覆盖为 1:
这是执行请求的智能合约部分:
function reEncryptData(
string memory reEncryptionKey,
string memory _encryptedData
) public returns (bytes32) {
Chainlink.Request memory request = buildOperatorRequest(
jobId,
this.fulfillReEncryption.selector
);
request.add("reEncryptionKey", reEncryptionKey);
request.add("encryptedData", _encryptedData);
return sendOperatorRequest(request, fee);
}
function fulfillReEncryption(
bytes32 requestId,
bytes memory _data
) public recordChainlinkFulfillment(requestId) {
reEncryptedData = string(_data);
}
这是我工作的 .toml:
type = "directrequest"
schemaVersion = 1
name = "Re-Encrypt Data"
contractAddress = "0xC1CD77E8cd5FB78898815952117Aca334fe573cd"
maxTaskDuration = "0s"
minIncomingConfirmations = "0"
observationSource = """
decode_log [type=ethabidecodelog
abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)"
data="$(jobRun.logData)"
topics="$(jobRun.logTopics)"]
decode_cbor [type=cborparse data="$(decode_log.data)"]
fetch [type=bridge name="re-encrypt" requestData="{\\"id\\": $(jobSpec.externalJobID), \\"data\\": { \\"encryptedData\\": $(decode_cbor.encryptedData), \\"reEncryptionKey\\": $(decode_cbor.reEncryptionKey)}}"]
parse [type=jsonparse path="data,reEncryptedData" data="$(fetch)"]
encode_large [type=ethabiencode abi="(bytes32 requestId, bytes _data)" data="{\\"requestId\\": $(decode_log.requestId), \\"_data\\": $(parse) }"]
encode_tx [type=ethabiencode
abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)"
data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_large)}"
]
submit_tx [type=ethtx to="0xC1CD77E8cd5FB78898815952117Aca334fe573cd" data="$(encode_tx)"]
decode_log -> decode_cbor -> fetch -> parse -> encode_large -> encode_tx -> submit_tx
"""
这是调用智能合约功能的代码:
await (
await reEncryption
.connect(dataSubject)
.reEncryptData(
"d48065aceb01496e1e4f8f74c7b68422ba16e1de7c80a9e927683f30c42b150804d505e4835912f719e96fd27f8e42345aa757070f5fa083974f5fb82fd384b4bdc74dbd75b6a60c68108d97e4c8dcd02c12a7d5552e28df3a7af366bb05b86ace",
"eyJrZXkiOiIwNGU5MjcwMzhiMjFjMDJhZDI2MmUxZmMwNmY4YmU0NTFiYmUyODU0Y2FmZGNmMDg4YzY5NDBjNTUzMjI4M2E3OTE5NTY1NDU0N2ZjZmQ2Yzg1OWJiZWQ2NmNlZmNlN2FkOTUyMDhkNmI5MjNkNjVkYjRmNTQyYWEwYTI3M2VmY2U1MDRmMTE4NmRkYzMxMjZhYWMwNGJhZWNlN2I5NDA4YzkwMDVkY2Q2MjJhYTlkY2E4YjU4NDg1MmI0NjU0MzAyNzMwM2U4NjA2MWRlNTNmYjcxNzk1NTAzZjNiYzRiNDMyNTJhNWFiODRiZDE2YmZkN2M4ZjYzZWRmMWM1ODIzZjVlZDNlYzg3OGJmNGY0ZTAzMmYxN2NiNWI5Y2RlOWU1YzMwN2U5NzI4ZjJmYzBhMWUwNGM2NzA2MDRjM2MyM2Q1NWIiLCJjaXBoZXIiOiJlcGtLVU1abEU1Q29Ucm1RbUUydkFRPT0ifQ=="
)
).wait();
我不明白我做错了什么,但我希望你能帮助我。谢谢!
我有:
您是否使用区块浏览器检查过您的预言机(运营商)合约中的相关交易?由于您没有发布交易链接,我们必须在这里进行一些猜测:
如果交易不存在(即 Chainlink 节点没有生成任何履行交易),则您的 Chainlink 节点存在问题,并且需要使用节点 GUI 或文件系统日志来调试作业运行。
如果交易确实存在,请检查是否有任何错误代码。这里常见的一个是
out of gas
,这意味着 fulfillReEncryption
函数中返回的预言机值和/或合约逻辑超出了节点每个请求允许花费的 Gas 量(通常默认为 500,000)。要解决此问题,您需要在节点(全局)或作业级别调整此值,减少响应中发送的数据量,或简化您的 fulfillReEncryption
逻辑。如果您没有看到 out of gas
错误,但确实看到交易出现一般性故障,则您的 fulfillReEncryption
函数逻辑中可能存在编码错误。仔细检查您的逻辑并重试。
希望有帮助!