2

我试图通过在下面的代码中uint timeStamp键入来打印:return timeStamp;return price;

pragma solidity ^0.6.7;

import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {

AggregatorV3Interface internal priceFeed;

/**
 * Network: Kovan
 * Aggregator: BTC/USD
 * Address: 0x6135b13325bfC4B00278B4abC5e20bbce2D6580e
 */
constructor() public {
    priceFeed = AggregatorV3Interface(0x6135b13325bfC4B00278B4abC5e20bbce2D6580e);
}

/**
 * Returns the latest price
 */
function getThePrice() public view returns (int) {
    (
        uint80 roundID, 
        int price,
        uint startedAt,
        uint timeStamp,
        uint80 answeredInRound
    ) = priceFeed.latestRoundData();
    return price;
    return timeStamp;
}
}

当我在 Remix Compiler 上编译上面的代码时,它回答:

TypeError:返回参数类型 uint256 不能隐式转换为预期类型(第一个返回变量的类型)int256。返回时间戳;^--------^

我倾向于认为我只需要输入int256 return timeStamp或类似的东西而不是return timeStamp;但我无法弄清楚。

反馈表示赞赏。

4

1 回答 1

4

您可以使用以下语法对uintto进行类型转换:int

return int(timeStamp);

2^255-1注意:对于(int最大值)和2^256-1uint最大值)之间的值,这将溢出(在 Solidity 0.7.x 和更早版本中)或引发异常(在 Solidity 0.8+ 中)。但这很可能只是一个理论案例,因为预计时间戳不会有这么大的值。


请注意,这条线是无法到达的,因为您已经返回price上一条线。

(
    uint80 roundID, 
    int price,
    uint startedAt,
    uint timeStamp,
    uint80 answeredInRound
) = priceFeed.latestRoundData();
return price; // the `price` is returned, and the function doesn't execute after this line
return timeStamp; // this is ignored because of the early return on previous line

如果要返回多个值,可以使用以下语法:

// note the multiple datatypes in the `returns` block
function getThePriceAndTimestamp() public view returns (int, uint) {
    (
        uint80 roundID, 
        int price,
        uint startedAt,
        uint timeStamp,
        uint80 answeredInRound
    ) = priceFeed.latestRoundData();
    return (price, timeStamp); // here returning multiple values
}
于 2021-07-17T18:16:39.747 回答