Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用Java SDK部署合约时报错:transaction hash mismatching #4288

Open
sylihahaha opened this issue Mar 7, 2024 · 4 comments
Open

Comments

@sylihahaha
Copy link

sylihahaha commented Mar 7, 2024

问题

使用fisco-bcos-java-sdk 3.6.0版本部署自定义合约时报错,并且自定义合约在控制台可以正常部署以及进行方法调用。

Caused by: ClientException{errorCode=-1, errorMessage='/home/ci/action-runner/_work/FISCO-BCOS/FISCO-BCOS/bcos-tars-protocol/bcos-tars-protocol/protocol/TransactionFactoryImpl.h(69): Throw in function virtual bcos::protocol::Transaction::Ptr bcostars::protocol::TransactionFactoryImpl::createTransaction(bcos::bytesConstRef, bool, bool)
Dynamic exception type: boost::wrapexcept<std::invalid_argument>
std::exception::what: transaction hash mismatching
'}
	at org.fisco.bcos.sdk.v3.client.ClientImpl.parseResponseIntoJsonRpcResponse(ClientImpl.java:1440)
	at org.fisco.bcos.sdk.v3.client.ClientImpl.callRemoteMethod(ClientImpl.java:1368)
	... 8 more

步骤

  1. 编写合约如下:
pragma solidity >=0.6.10 <0.8.20;
import './TableV320.sol';

contract AccountTest
{
    address _owner;

    TableManager constant tm =  TableManager(address(0x1002));
    Table table;
    string constant TABLE_NAME = "t_accout";
    constructor () public {
        // create table
        string[] memory columnNames = new string[](2);
        columnNames[0] = "account";
        columnNames[1] = "name";
        TableInfo memory tf = TableInfo(KeyOrder.Lexicographic ,"refNo", columnNames);

        tm.createTable(TABLE_NAME, tf);
        address t_address = tm.openTable(TABLE_NAME);
        require(t_address!=address(0x0),"");
        table = Table(t_address);
	_owner = msg.sender;
    }

    function insert(string memory account, string memory name, string memory refNo) public returns(int) {
		Entry memory entry = Entry(refNo, new string[](2));
        entry.fields[0] = account;
        entry.fields[1] = name;
        int32 result = table.insert(entry);
        return result;
    }

    function select(string memory refNo) public returns (string memory)
	{
		Entry memory entry = table.select(refNo);
		string memory account;
        if(entry.fields.length == 2){
			account = entry.fields[0];
        }
        return account;
    }
}
  1. 使用控制台部署和合约调用如下:
[group0]: /apps> deploy AccountTest
transaction hash: 0x7e385066493a1b19bba7821906fce26d46d2d8f21bc2bbee900b00387c3864a6
contract address: 0xb1f8731f406a9bd4c9f70be544032ca58c9b2c46
currentAccount: 0x4bf9de7cd28becdc540c0ca7110d25f6a427efad

[group0]: /apps> call AccountTest 0xb1f8731f406a9bd4c9f70be544032ca58c9b2c46 insert "Account1" "Mary" "ref01"
transaction hash: 0x1067977a856938d009e1a9620ff395778899521b53598f6fc84cbcb3f7115d8a
---------------------------------------------------------------------------------------------
transaction status: 0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Receipt message: Success
Return message: Success
Return value size:1
Return types: (INT)
Return values:(1)
---------------------------------------------------------------------------------------------

[group0]: /apps> call AccountTest 0xb1f8731f406a9bd4c9f70be544032ca58c9b2c46 select "ref01"
transaction hash: 0x07112d69d672281a959943dbbb9aa531d6a98ea711dbcf2fdafc4ce4c20a8637
---------------------------------------------------------------------------------------------
transaction status: 0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Receipt message: Success
Return message: Success
Return value size:1
Return types: (STRING)
Return values:(Account1)
---------------------------------------------------------------------------------------------
  1. 生成Java文件,并拷贝到java项目,运行以下代码报错:transaction hash mismatching:
BcosSDK sdk =  BcosSDK.build(configFile);
// 为群组group初始化client
Client client = sdk.getClient("group0");

// 向群组1部署HelloWorld合约
CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
AccountTest deploy = AccountTest.deploy(client, cryptoKeyPair);
@sylihahaha
Copy link
Author

将生成的java文件注释以下行后可以正常部署,不太明白正确逻辑应该如何使用?

protected AccountTest(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
//        this.transactionManager = new ProxySignTransactionManager(client);
    }

@kyonRay
Copy link
Member

kyonRay commented Mar 7, 2024

将生成的java文件注释以下行后可以正常部署,不太明白正确逻辑应该如何使用?

protected AccountTest(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
//        this.transactionManager = new ProxySignTransactionManager(client);
    }

这是一个已知bug,会在下个版本解决。这是生成Java文件时的bug,如果设置transactionManager就会用新的transactionManager的接口发送v1版本的交易,只有在区块链3.6.0以上的版本节点支持v1交易。旧的节点都会因为不认识v1版本交易而哈希计算错误。

TransactionManager的使用可以参考以下文档:https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/docs/sdk/java_sdk/assemble_service.html

@kyonRay
Copy link
Member

kyonRay commented Mar 8, 2024

@kyonRay
Copy link
Member

kyonRay commented Mar 11, 2024

解决方案有以下几种:

  1. 源码编译控制台时,可以将org.fisco-bcos.code-generator:bcos-code-generator版本号改成 1.4.0
  2. 若使用已下载的控制台时,可以将lib目录下bcos-code-generator-1.3.0.jar 替换成 bcos-code-generator-1.4.0.jar版本,下载链接:https://github.com/FISCO-BCOS/code-generator/releases/download/v1.4.0/bcos-code-generator-1.4.0.jar
  3. 若已经生成好Java 文件,可以按照楼主的方式将构造函数中的TransactionManager初始化的代码进行注释即可:
protected AccountTest(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
        // this.transactionManager = new ProxySignTransactionManager(client); // 注释这一行
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants