solidity智能合约
【问题分类】
- [] bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
使用java-sdk部署solidity版本的智能合约,如何获取类似于evm的智能合约地址。是否可以通过指定智能合约名称计算得出,如java-sdk-demo中的方法
public static String calcContractName(String contractName) {
return Hash.sha3String(contractName).substring(26);
}
通过该方法事先计算出hash,然后再部署合约时,传入hash值即可。
如果新部署一个智能合约,内部依赖于其他已部署的合约,那么已部署的合约如何作为参数传入新部署的合约,是否传入上文通过hash算法计算出的hash字符串即可,类似下文
Function function = new Function("", Arrays.asList(new Address("0x2560eeec5a3b9d21561b7ffb622739aac8f18388")),
Collections.emptyList());
String methodDataStr = FunctionEncoder.encode(function);
Map<String, byte[]> paramMap = new HashMap<>();
paramMap.put("data", methodDataStr.substring(10).getBytes());
还是通过这种
String methodDataStr = FunctionEncoder.encodeConstructor(Arrays.asList(new Address(contractInfoAddress)));
Map<String, byte[]> paramMap = new HashMap<>();
paramMap.put("data", methodDataStr.getBytes());
String contractAddress = ChangAnUtils.calculateContractAddress("ChainCrossProxy");
try {
byte[] byteCode = FileUtils.getResourceFileBytes("ChainCrossProxy.bin");
System.out.println("proxy contract address:" + contractAddress);
Request.Payload payload = chainClient.createContractCreatePayload(contractAddress, "1", byteCode,
ContractOuterClass.RuntimeType.EVM, paramMap);
Request.EndorsementEntry[] endorsementEntries = SdkUtils
.getEndorsers(payload, new User[]{chainClient.getClientUser()});
responseInfo = chainClient.sendContractManageRequest(payload, endorsementEntries, 10000, 10000);
System.out.println("response:" + responseInfo.toString());
} catch (Exception e) {
e.printStackTrace();
}
目前通过这两种方式,虽然合约可以部署成功,但是都没有办法调用传入合约的方法 长安链目前是否支持类似注入似的合约用法,下附合约源码
pragma solidity >=0.4.22 <0.6.0;
contract TestSelf {
function getIncrement() public view
returns(uint256)
{
return 100;
}
}
pragma solidity >=0.4.22 <0.6.0;
import "./TestSelf.sol";
contract Test {
TestSelf cns;
constructor(TestSelf contractInfo) public {
cns =contractInfo;
}
function getIncrement() public view
returns(uint256)
{
return cns.getIncrement();
}
}
目前通过调用合约的方式,去部署新的智能合约时,会报out of memory的异常信息,下附合约代码
/*
* deploy contract by contract binary code
*/
function deployContract(bytes memory _bin) public returns(address addr) {
bool ok = false;
assembly {
addr := create(0,add(_bin,0x20), mload(_bin))
ok := gt(extcodesize(addr),0)
}
if(!ok) {
revert("deploy contract failed");
}
}
java调用代码
byte[] testCode = FileUtils.getResourceFileBytes("Test.bin");
Function deployFunction = new Function("deployContract", Arrays.asList(new DynamicBytes(testCode)),
Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {
}));
String deployEncoder = FunctionEncoder.encode(deployFunction);
String deployFunctionId = deployEncoder.substring(0,10);
Map<String, byte[]> deployParamMap = new HashMap<>();
deployParamMap.put("data", deployEncoder.getBytes());
ResultOuterClass.TxResponse result = chainClient.invokeContract(contractAddress, deployFunctionId, null, deployParamMap, 300000, 300000);
System.out.println("result:"+result);
报错信息如下:
message: "OK"
contract_result {
code: 1
message: "contract initial fail, out of memory"
}
tx_id: "24f382bc006d80e6516ce2de4be0317bb3cff1a64b1d9b78a4848888045c0128"
```[Test.bin](/uploads/7eeca60155aca9d0a24ebd34ebdc27ba/Test.bin)
> 具体的现象,操作步骤,前置条件等,尽可能描述清楚,有截图说明更佳
### 【相关日志文件】(如果有报错日志请贴图,或者上传附件)
> chainmaker-go 的 log/system.log & bin/panic.log file *
> [docker.log](/uploads/3022726f2828c03729090624bb95ffe7/docker.log)
> SDK 的 sdk.log file
### 【系统信息】(请填写系统信息,方便定位问题)
- **chainmaker-go version * :** [v2.1.0]
- **OS & version * :**
- **docker镜像 version:**
v2.3.0
- **管理台 version:**
- 如果是管理台的相关问题,请附带管理台版本,如果不是可忽略。
- **区块浏览器 version:**
- 如果是浏览器的相关问题,请附带浏览器版本,如果不是可忽略。
- **合约IDE version:**
- 如果是合约IDE的相关问题,请附带合约IDE版本,如果不是可忽略。
- **web签名插件 version:**
- 如果是web签名插件的相关问题,请附带web签名插件版本,如果不是可忽略。
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information