Skip to content

Illegal argument with createShieldedContractParameters #6165

@317787106

Description

@317787106

Software Versions

OS : Linux
JVM : Oracle Corporation 1.8.0_161 amd64
Version : 4.7.4
Code : 18306

Expected behavior

The gRPC API of the wallet should specify the root cause when request failed, not the error log stack.

Actual behavior

I was running a fullnode on Nile, and constructed PrivateShieldedTRC20Parameters with the following values in my program:

{
    "ask":"c2513e9e308494932bd82e0ce53662d17421d90b72a8471a0a12b8552a336e02",
    "nsk":"4c6bf3dd4a0643d20b628f7e45980c5e187f07a51d6f3e86aaf1ab916c07eb0d",
    "ovk":"17a58d9a5058da6e42ca12cd289d0a6aa169b926c18e19bca518b8d6f8674e43",
    "from_amount":"100",
    "shielded_receives":[
        {
            "note":{
                "value":10,
                "payment_address":"",
                "rcm":"16b6f5e40444ab7eeab11ae6613c27f35117971efa87b71560b5813829c9390d"
            }
        }
    ],
    "shielded_TRC20_contract_address":"41D7175DEDFD7EA842493CB4CDA6B066501F0FA1C8"
}

Then I called the gRPC API createShieldedContractParameters with above PrivateShieldedTRC20Parameters. I found the fullnode throws error stack in tron.log:

11:08:59.477 ERROR [rpc-full-executor-1] [API](RpcApiService.java:2485) createShieldedContractParameters: 
java.lang.IllegalArgumentException: Input too short: 0
        at org.tron.common.utils.Bech32.decode(Bech32.java:149)
        at org.tron.core.zen.address.KeyIo.decodePaymentAddress(KeyIo.java:33)
        at org.tron.core.Wallet.buildShieldedTRC20Output(Wallet.java:3467)
        at org.tron.core.Wallet.createShieldedContractParameters(Wallet.java:3536)
        at org.tron.core.Wallet$$FastClassBySpringCGLIB$$3f6b5781.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
        at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
        at org.tron.common.prometheus.MetricAspect.walletAroundAdvice(MetricAspect.java:43)
        at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
        at org.tron.core.Wallet$$EnhancerBySpringCGLIB$$476d52c3.createShieldedContractParameters(<generated>)
        at org.tron.core.services.RpcApiService$WalletApi.createShieldedContractParameters(RpcApiService.java:2477)
        at org.tron.api.WalletGrpc$MethodHandlers.invoke(WalletGrpc.java:11234)
        at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:182)
        at io.grpc.PartialForwardingServerCallListener.onHalfClose(PartialForwardingServerCallListener.java:35)
        at io.grpc.ForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:23)
        at io.grpc.ForwardingServerCallListener$SimpleForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:40)
        at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:355)
        at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:867)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

It was an uncaught exception. This interface should deal with it elegantly.

Therefore, I tried with the HTTP API wallet/createshieldedcontractparameters using the same parameter:

curl --location 'http://localhost:8090/wallet/createshieldedcontractparameters' --header 'Content-Type:application/json' --data '{
    "ask":"c2513e9e308494932bd82e0ce53662d17421d90b72a8471a0a12b8552a336e02",
    "nsk":"4c6bf3dd4a0643d20b628f7e45980c5e187f07a51d6f3e86aaf1ab916c07eb0d",
    "ovk":"17a58d9a5058da6e42ca12cd289d0a6aa169b926c18e19bca518b8d6f8674e43",
    "from_amount":"100",
    "shielded_receives":[
        {
            "note":{
                "value":10,
                "payment_address":"",
                "rcm":"16b6f5e40444ab7eeab11ae6613c27f35117971efa87b71560b5813829c9390d"
            }
        }
    ],
    "shielded_TRC20_contract_address":"41D7175DEDFD7EA842493CB4CDA6B066501F0FA1C8"
}

I got the following result:

{"Error":"class java.lang.IllegalArgumentException : Input too short: 0"}

but the log didn’t show any error. It’s more elegant.

Frequency

I can repeat it certainly using the gRPC API.

Backtrace

[backtrace]

When submitting logs: please submit them in text, not screenshots.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions