我正在尝试使用区块链上已部署的智能合约的功能返回值。
pragma solidity 0.6.2;
contract Caller {
address cont;
function changeAdd(address _change) public {
cont = _change;
}
function caller (bytes memory test) public returns(bool, bytes memory) {
bytes memory payload = abi.encodeWithSignature("callMe(bytes)", test);
(bool success, bytes memory result)= address(cont).call(payload);
return (success, (result));
}
function viewCont() public view returns(address) {
return cont;
}
}
部署的测试合同是这样的:
pragma solidity 0.6.2;
contract Store {
uint counter;
function callMe(bytes calldata test) external returns(bytes memory) {
counter++;
return abi.encode(test);
}
function viewCounter () public view returns(uint256) {
return(counter);
}
function clearCounter() public {
counter = 0 ;
}
}
在此示例中,我将在分配了随机地址的区块链上部署合同“商店”,可以通过Caller.changeAdd函数指向该地址,以使用Caller.caller函数。因此,我试图将字节形式的数据发送到Store合同,该合同应该将相同的数据发送回Caller合同。我试图仅隔离最初发送的数据,所以我可以用它来测试区块链上智能合约之间的交互。我从一开始就尝试发送整数,但是找不到方法。因此我使用了字节并且可以正常工作,但是我收到的数据仍然与我发送的数据不同(例如,我发送0x0并收到一个大字节数,与0x0不同)。
对于在两个不同的,未链接的智能合约之间如何接收和处理数据的帮助,我将不胜感激,
答案 0 :(得分:0)
您是否尝试使用abi.decode的Solidity功能。
在下面的示例中,合同B调用合同A的setName
,然后使用abi.decode
函数对结果进行解码。
contract A {
string public name;
constructor(string memory tokenName) public {
name = tokenName;
}
function setName(string memory newName) public returns ( string memory){
name = newName;
return newName;
}
}
contract B {
event Log(string msg);
string public myName;
function call(address addr, string memory newName) public {
bytes memory payload = abi.encodeWithSignature("setName(string)", newName);
(bool success, bytes memory result)= addr.call(payload);
// Decode data
string memory name = abi.decode(result, (string));
myName = name;
emit Log(name);
}
}