Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Sign in
issue
issue
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 23
    • Issues 23
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar

新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

  • chainmaker
  • issueissue
  • Issues
  • #775

Closed
Open
Opened Aug 09, 2023 by jian wang@yanshu1 of 18 tasks completed1/18 tasks

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签名插件版本,如果不是可忽略。
Edited Aug 18, 2023 by jian wang
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: chainmaker/issue#775

Copyright © 2021 ChainMaker Org. All Rights Reserved. 长安链 版权所有。