我想创建一个包含功能的应付令牌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) 我在将 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。如何将其公开给外部网络?
我需要在 Solidity 智能合约中存储这种类型的值0xff0000或0x00ff08(十六进制颜色表示),并能够在合约内将其转换为具有相同文本字符的字符串"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) 假设我有一个 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) 我有 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) 我正在尝试在 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)
这里可能有什么问题?
要连接到以太坊测试网,配置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 测试网添加网络配置?
(请注意,我使用种子短语而不是原始私钥)
我有一个 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) 我有两个交互的智能合约,正在 Hardhat 中开发/测试并部署到RSK:
\nDelegateCallee带有函数的智能合约getData(),发出一个Received事件:contract DelegateCallee {\n event Received(address sender, uint value);\n function getData() external payable {\n emit Received(msg.sender, msg.value);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nDelegateCaller智能合约使用 Solidity来delegateCall调用:getData()DelegateCalleecontract 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}\nRun Code Online (Sandbox Code Playgroud)\n我正在运行 Hardhat 测试来拦截DelegateCallee. 当我getData() …
我正在创建一个 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 以便将交易发送到智能合约?
我正在尝试计算RSK上的 rUSDT 代币转账交易花费了多少天然气。如果我转到RSK explorer rUSDT 事件页面并选择带有转账事件的第一个可用交易,我会发现除了我感兴趣的转账事件之外,它还包括24 个其他事件(发送、转换、批准等)。因此,为此交易支付的 Gas 费(769,510 Gas * 0.000000000065540656 RBTC c)包含为所有这 24 个事件支付的 Gas 量。有没有办法将转账与其他转账“分开”,并计算仅为它们支付的汽油费?我的想法是使用共价数据库来查询 RSK 区块链。我编写此查询是为了计算最近 20 笔具有转账事件的交易所支付的 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)