小编Ale*_*hin的帖子

如何限制令牌接收者调用者接受的令牌地址?

我想创建一个包含功能的应付令牌transferAndCall(TokenReceiver to, uint256 amount, bytes4 selector)。通过调用该函数,您可以将代币转移到TokenReceiver智能合约地址,然后调用接收者,接收者又调用接收者onTransferReceived(address from,uint tokensPaid, bytes4 selector)中指定的函数。bytes4 selector

请注意,这与 ERC1363 类似/受到ERC1363的启发。

这是我的应收令牌的简化版本:

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MeowToken is ERC20 {
  constructor() ERC20("MeowToken", "MEO") {
    ERC20._mint(msg.sender, 10_000_000);
  }
  function transferAndCall(
    TokenReceiver to,
    uint256 amount,
    bytes4 selector
  ) external {
    ERC20.transfer(address(to), amount);
    to.onTransferReceived(msg.sender, amount, selector);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个令牌接收器:

contract TokenReceiver {
  address acceptedToken;
  event PurchaseMade(address from, uint tokensPaid);
    
  modifier acceptedTokenOnly () {
    require(msg.sender == address(acceptedToken), "Should be called only via the …
Run Code Online (Sandbox Code Playgroud)

solidity rsk hardhat

10
推荐指数
3
解决办法
313
查看次数

如何将 RSK 节点暴露给外部网络?

我在将 RSK 节点暴露给外部 IP 时遇到问题。我的启动命令如下所示:

java \
  -cp $HOME/Downloads/rskj-core-3.0.1-IRIS-all.jar \
  -Drsk.conf.file=/root/bitcoind-lnd/rsk/rsk.conf \
  -Drpc.providers.web.cors=* \
  -Drpc.providers.web.ws.enabled=true \
  co.rsk.Start \
  --regtest

Run Code Online (Sandbox Code Playgroud)

这是我的rsk.conf

rpc {
 
     providers {
         web {
             cors: "*",
             http {
                 enabled = true
                 bind_address = "0.0.0.0"
                 hosts = ["localhost", "0.0.0.0"]
                 port: 4444
             }
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

API 可以从本地主机访问,但从外部网络访问时出现错误 400。如何将其公开给外部网络?

rsk

9
推荐指数
1
解决办法
133
查看次数

Solidity 将十六进制数字转换为十六进制字符串

我需要在 Solidity 智能合约中存储这种类型的值0xff00000x00ff08(十六进制颜色表示),并能够在合约内将其转换为具有相同文本字符的字符串"ff0000"。我打算在 RSK 上部署这个智能合约。

我的想法是将这些值存储在一个bytes3or 简单的uint变量中,并使用一个纯函数将bytes3or转换uint为相应的字符串。我找到了一个可以完成这项工作并在 Solidity 0.4.9 上工作的函数

pragma solidity 0.4.9;

contract UintToString {
    function uint2hexstr(uint i) public constant returns (string) {
        if (i == 0) return "0";
        uint j = i;
        uint length;
        while (j != 0) {
            length++;
            j = j >> 4;
        }
        uint mask = 15;
        bytes memory bstr = new bytes(length);
        uint k = length - 1;
        while (i …
Run Code Online (Sandbox Code Playgroud)

bit-manipulation solidity rsk

7
推荐指数
1
解决办法
3979
查看次数

如何计算 RSK 上的智能合约部署价格?

假设我有一个 ERC20 智能合约,正在Hardhat中开发和测试:

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract Erc20Token is ERC20, Ownable {
  constructor(uint initialSupply) ERC20("ERC20 Token", "ETK") {
    ERC20._mint(msg.sender, initialSupply);
  }
}
Run Code Online (Sandbox Code Playgroud)

我打算使用以下 Hardhat脚本将其部署到RSKdeploy.js网络:

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract Erc20Token is ERC20, Ownable {
  constructor(uint initialSupply) ERC20("ERC20 Token", "ETK") {
    ERC20._mint(msg.sender, initialSupply);
  }
}
Run Code Online (Sandbox Code Playgroud)

要运行此脚本并在RSK 主网上部署我的智能合约,我需要在终端中运行以下命令:

async function deploy() {
  try {
    const initialSupply = 1e6;
    const ERC20TokenFactory = await ethers.getContractFactory('Erc20Token');
    const erc20Token …
Run Code Online (Sandbox Code Playgroud)

solidity rsk ethers.js hardhat

6
推荐指数
1
解决办法
680
查看次数

如何解码智能合约中的字节calldata?

我有 2 个交互的智能合约,正在Hardhat中开发/测试并部署到RSK。其中之一是具有功能的ERC1363 支付代币transferAndCall(address,uint256,bytes),第二个是代币接收器,buy(address,uint,uint,bytes3)我需要对其函数调用进行链下编码并发送到代币的transferAndCall函数bytes参数。ERC1363 合约将代币从发送者的账户转移到接收者智能合约的账户,然后在同一交易中调用接收者的onTransferReceived(address,address,uint256,bytes),其中最后一个bytes参数应该是编码buy函数调用。

这是我的接收者智能合约:

contract TokenReceiver is IERC1363Receiver {
  IERC1363 acceptedToken;
    
  constructor(IERC1363 _acceptedToken) {
    acceptedToken = _acceptedToken;
  }
  event PurchaseMade(address indexed sender, uint tokensPaid, uint productAmount, bytes3 color);
    
  function buy(address sender, uint tokensPaid, uint productAmount, bytes3 color) public {
    // allowed to be called only via the accepted token
    require(msg.sender == address(acceptedToken), "I accept purchases in Payable Tokens");
    emit …
Run Code Online (Sandbox Code Playgroud)

solidity rsk ethers.js hardhat

6
推荐指数
2
解决办法
4564
查看次数

在 Windows 计算机上运行 RSKj 节点时如何修复 LevelDB 库加载错误?

我正在尝试在 Windows 计算机上运行 RSK 区块链节点 RSKj。当我在终端中运行此行时:

C:\Users\yemode> java -cp C:\Users\yemode\Downloads\Programs\rskj-core-3.0.1-IRIS-all.jar  co.rsk.Start
Run Code Online (Sandbox Code Playgroud)

RSKj 节点开始运行,但出现以下错误:

Cannot load secp256k1 native library: java.lang.Exception: No native library is found for os.name=Windows and os.arch=x86. path=/org/bitcoin/native/Windows/x86
Exception in thread "main" java.lang.RuntimeException: Can't initialize database
        at org.ethereum.datasource.LevelDbDataSource.init(LevelDbDataSource.java:110)
        at org.ethereum.datasource.LevelDbDataSource.makeDataSource(LevelDbDataSource.java:70)
        at co.rsk.RskContext.buildTrieStore(RskContext.java:1015)
        at co.rsk.RskContext.buildAbstractTrieStore(RskContext.java:935)
        at co.rsk.RskContext.getTrieStore(RskContext.java:416)
        at co.rsk.RskContext.buildRepositoryLocator(RskContext.java:1057)
        at co.rsk.RskContext.getRepositoryLocator(RskContext.java:384)
        at co.rsk.RskContext.getTransactionPool(RskContext.java:353)
        at co.rsk.RskContext.buildInternalServices(RskContext.java:829)
        at co.rsk.RskContext.buildNodeRunner(RskContext.java:821)
        at co.rsk.RskContext.getNodeRunner(RskContext.java:302)
        at co.rsk.Start.main(Start.java:34)
Run Code Online (Sandbox Code Playgroud)

这里可能有什么问题?

rsk

5
推荐指数
1
解决办法
163
查看次数

如何配置 Hardhat 以连接到 RSK 测试网?

要连接到以太坊测试网,配置hardhat.config.js如下:

  networks: {
    ropsten: {
      url: `https://eth-ropsten.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,
      accounts: [`${ROPSTEN_PRIVATE_KEY}`]
    }
  }

Run Code Online (Sandbox Code Playgroud)

(取自此处:https://hardhat.org/tutorial/deploying-to-a-live-network.html

如何为 RSK 测试网添加网络配置?

(请注意,我使用种子短语而不是原始私钥)

rsk rootstock

5
推荐指数
1
解决办法
233
查看次数

如何通过 Hardhat 测试 Solidity Fallback() 函数?

我有一个 Solidity 智能合约Demo,正在Hardhat中开发并在RSK Testnet上进行测试。

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

contract Demo {
    event Error(string);
    fallback() external {
      emit Error("call of a non-existent function");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想确保调用该函数并发出fallback事件。Error为此,我尝试nonExistentFunction在智能合约上调用:

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

contract Demo {
    event Error(string);
    fallback() external {
      emit Error("call of a non-existent function");
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,HarhatTypeError在实际连接到 RSK 上的智能合约之前就抛出了一个问题:

  Demo
    1) should invoke the fallback function


  0 passing (555ms)
  1 failing

  1) Demo
       should invoke …
Run Code Online (Sandbox Code Playgroud)

solidity rsk ethers.js hardhat

5
推荐指数
1
解决办法
1538
查看次数

为什么通过“delegateCall”调用的智能合约函数发出的事件会消失?

我有两个交互的智能合约,正在 Hardhat 中开发/测试并部署到RSK

\n
    \n
  1. DelegateCallee带有函数的智能合约getData(),发出一个Received事件:
  2. \n
\n
contract DelegateCallee {\n  event Received(address sender, uint value);\n  function getData() external payable {\n    emit Received(msg.sender, msg.value);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. DelegateCaller智能合约使用 Solidity来delegateCall调用:getData()DelegateCallee
  2. \n
\n
contract DelegateCaller {\n  address callee;\n\n  constructor(address _callee) {\n    callee = _callee;\n  }\n\n  function delegateCallGetData() external payable {\n    (bool success, ) = callee.delegatecall(\n      abi.encodeWithSelector(DelegateCallee.getData.selector)\n    );\n    require(success, "delegate call failed");\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我正在运行 Hardhat 测试来拦截DelegateCallee. 当我getData() …

solidity rsk ethers.js hardhat

5
推荐指数
1
解决办法
860
查看次数

如何从 RSKj regtest 区块链节点的测试账户发送 web3 交易

我正在创建一个 DApp,它连接到部署在由 RSKj Java 应用程序运行的本地测试 RSK 区块链 (regtest) 上的智能合约。我打算通过连接到 Metamask 的 Web3 发送交易。在 DApp 中,我通过发送 Web3 请求来获取帐户列表:

const accounts = await web3.eth.getAccounts()
Run Code Online (Sandbox Code Playgroud)

此外,accounts将包含:

[
  '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
  '0x7986b3DF570230288501EEa3D890bd66948C9B79',
  '0x0a3aA774752ec2042c46548456c094A76C7F3a79',
  '0xCF7CDBbB5F7BA79d3ffe74A0bBA13FC0295F6036',
  '0x39B12C05E8503356E3a7DF0B7B33efA4c054C409',
  '0xc354D97642FAa06781b76Ffb6786f72cd7746C97',
  '0xDEBe71E1dE41Fc77C44Df4b6Db940026E31b0e71',
  '0x7857288e171C6159C5576d1bD9AC40c0c48a771C',
  '0xa4Dea4d5C954f5FD9e87f0e9752911E83a3D18b3',
  '0x09a1edA29F664ac8f68106F6567276dF0C65D859',
  '0xeC4ddeB4380Ad69B3E509BaAd9f158CDF4E4681d'
]
Run Code Online (Sandbox Code Playgroud)

如何将这些帐户(或至少其中第一个帐户)导入 Metamask 以便将交易发送到智能合约?

rpc web3js rsk

4
推荐指数
1
解决办法
172
查看次数

如何计算 RSK 上单次稳定币转账所支付的 Gas 费?

我正在尝试计算RSK上的 rUSDT 代币转账交易花费了多少天然气。如果我转到RSK explorer rUSDT 事件页面并选择带有转账事件的第一个可用交易,我会发现除了我感兴趣的转账事件之外,它还包括24 个其他事件(发送、转换、批准等)。因此,为此交易支付的 Gas 费(769,510 Gas * 0.000000000065540656 RBTC c)包含为所有这 24 个事件支付的 Gas 量。有没有办法将转账与其他转账“分开”,并计算仅为它们支付的汽油费?我的想法是使用共价数据库来查询 RSK 区块链。我编写此查询是为了计算最近 2​​0 笔具有转账事件的交易所支付的 Gas 费用。

SELECT encode(t.hash, 'hex'),  t.gas_spent * t.gas_price / 10^18 AS gas_paid
FROM chain_rsk_mainnet.block_log_events e
    INNER JOIN chain_rsk_mainnet.block_transactions t
    ON e.block_id = t.block_id
    AND e.tx_offset = t.tx_offset
WHERE e.topics[1] = E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
    AND e.sender = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
    AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
    AND t.signed_at …
Run Code Online (Sandbox Code Playgroud)

sql rsk

4
推荐指数
1
解决办法
97
查看次数

标签 统计

rsk ×11

solidity ×6

hardhat ×5

ethers.js ×4

bit-manipulation ×1

rootstock ×1

rpc ×1

sql ×1

web3js ×1