동도리 개발 로그

스마트컨트렉트 - ERC1155 - byte type 생성 본문

블록체인/이더리움

스마트컨트렉트 - ERC1155 - byte type 생성

동돌이 2022. 3. 18. 16:57
반응형

오늘도 역시 ERC1155 사용 도중 발생한 문제에 대한 정리이다. 

 

ERC1155중 safeTransferFrom 함수는 기본적으로 



from, to, id, amount, data를 변수로 받게 되어있다. 

from : 트랜잭션을 생성하는 주소 및 해당 id에 대해 amount 이상의 토큰을 가지고 있어야한다. 

to : 받는 주소

id :  보내는 토큰 id

amount :  토큰 갯수

data : 전송할 데이터

 

data에 아무런 데이터를 넣지 않더라도 dataType에 따른 빈값을 넣어줘야 function이 생성이 되는 것 같다. 

 

위 사진은 리믹스에서 전송하는 부분인데 위처럼 data 에 빈 배열을 넣어주면 문제 없이 정상 작동하지만 코드상으로는 쉽지 않았다. 

 

우선 data 타입이 bytes 타입인것을 확인하고

...
{
    "internalType": "bytes",
    "name": "data",
    "type": "bytes"
}
...

해당 타입에 해당하는 datatype을 다른 타입들과 같은 위치인

org.web3j.abi.datatypes.generated

에서 찾으려했더니

Bytes1 부터 Bytes 32 까지 32개가 있다...

 

new Bytes1(new byte[] { 0 })

위와같이 만들어서 넣어줘도 트랜잭션 생성 시 트랜잭션이 pending에 들어가고 전송은 되지 않는 상황이 발생

 

그래서 기존에 내가 트랜잭션만들어서 서명하고 전송하는 방법이 아닌

web3j generate solidity 를 이용하여 .sol 을 java 파일로 바꿔주는 방법을  이용함

http://docs.web3j.io/4.8.7/getting_started/deploy_interact_smart_contracts/

 

Deploy and Interact with Smart Contracts - Web3j

Deploy and Interact with Smart Contracts Working with smart contracts and Java smart contract wrappers Web3j can auto-generate smart contract wrapper code to deploy and interact with smart contracts without leaving the JVM. To generate the wrapper code, co

docs.web3j.io

$ web3j generate solidity -b /path/to/<smart-contract>.bin -a /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name

위 커멘드로 생성된 java 파일을 코드에 넣고 확인해보니 

safeTransferFrom에 대한 부분이 아래와 같이 생성되었다. 

 

여기서 new org.web3j.abi.datatypes.DynamicBytes(data) 처럼 DynamicBytes 를 사용하는 것을 보고

기존에도 사용 할 수 있을 것 같아서 아래와 같이 바꾸었더니 잘 된다!.

Function func = new Function("safeTransferFrom",
    Arrays.<Type>asList(new Address(from), new Address(receiver), new Uint256(id), new Uint256(amount), new DynamicBytes(new byte[]{0}))
    , Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));

 

위 web3j generate를 사용하여 나온 java코드를 사용하게 되면 블록 생성 시간안에

여러 트랜잭션을 생성하기위해 nonce를 따로 관리하여 트랜잭션을 생성할 수 가 없다.

결국엔 내가 사용하고자 하는 서비스에 맞게 nonce를 관리 하기 위해 generate한 코드는 사용안하게된다.

 

 

반응형

'블록체인 > 이더리움' 카테고리의 다른 글

ERC1155 SmartContract 정리  (0) 2022.03.21
Web3j - SmartContract (ethCall Decoder) ERC1155  (0) 2022.03.10