如何使用 web3 java 部署代理合约

问题描述 投票:0回答:0

我正在尝试使用 web3 java 部署代理合同,我发现以下是一种方法。 (p.s我不确定这是否正确。如果我错了或者你有更好的方法请指正我)

我的代理合约的构造函数看起来像这样

constructor(address beacon, bytes memory data,string memory assetId) payable {
        assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1));
        _upgradeBeaconToAndCall(beacon, data, false);
        emit YL_BeaconProxyDeployed(address(this), beacon, msg.sender,assetId);
    }

我想做的是部署一个代理合约。我已经部署了我的实现和信标合约。这些是我部署代理所遵循的步骤。

  1. 首先我计算了我的实现合约的“初始化”函数的函数编码器如下

    Function function =
                         new Function(
                                 "initialize", //TODO change parameters here
                                 Arrays.asList(new Utf8String("YL"),  new Uint256(1),new Address("0x1cEb1c99ac0c95B12602020De82b84edad62E8FB"),new Uint256(100),new Uint256(50),new Utf8String(""),new Utf8String(""),new Bool(true),new Bool(true)),
                                 Collections.emptyList());
                String encodedFunction = FunctionEncoder.encode(function);
    
  2. 然后我为我的代理合约的构造函数计算了函数编码器如下

String encodedConstructor =
                    FunctionEncoder.encodeConstructor(
                            Arrays.asList(
                                    new Address(beaconAddress),
                                    new DynamicBytes(encodedFunction.getBytes(StandardCharsets.UTF_8)),
                                    new Utf8String("1"))); 

我这样做的原因是我调用

createContractTransaction
函数我需要在
data
字段中传递这些数据,如下所示

 Transaction tx = Transaction.createContractTransaction("0x1cEb1c99ac0c95B12602020De82b84edad62E8FB",nonce, gasPrice,blockGasLimit,BigInteger.ZERO,proxy_bin +encodedConstructor);

我遇到的问题是,当我调用

encodedConstructor
时,先前编码的参数看起来会再次编码。我得出这个结论是因为当我打印出来时我可以看到这个输出

000000000000000000000000a7cf300e62ea5c7ea611e71fb30a41182ac3acdd00000000000000000000000000000000000000000000000000
0000000000006000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000040a307836323931653539383030303030303030303030303030303030303030303030303
0303030303030303030303030303030303030303030303030303030303030303030303030313430303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303138303030
3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031303030303030303030303030303030303030303030303030316365623163393961633063393562313236303
2303230646538326238346564616436326538666230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303634303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030303030303030303030333230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030316
3303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031653030303030303030303030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030313030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303130303030303030303030303030303030303
0303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030353539363136313663363130303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030323539346330303030303030303030303030303030303030303030303030303030303030303
0303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001310
0000000000000000000000000000000000000000000000000000000000000

我发现想要的输出是

000000000000000000000000a7cf300e62ea5c7ea611e71fb30a41182ac3acdd0000000000000000000000000000000000000000000000000000000
00000006000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002046291e598000000000000000000000000000000000000000000000000000000000000014000
0000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001ceb1c99ac0c95b12602020de82b84edad62e8fb000000000000000000000
0000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000
0000000000000000000001e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000
000055961616c610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002594c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

我发现在

encodeConstructor
函数中,因为我将先前编码的参数作为输入传递,它们将再次被编码。

有解决办法吗?这是在 web3 java 中部署代理合约的唯一方法吗?如果不是,我愿意接受新想法。谢谢

java proxy web3-java web3
© www.soinside.com 2019 - 2024. All rights reserved.