JEP's Diary

web3swift 3.0.4 적용 중...포기를 선언한 이유 본문

Development/개발일지

web3swift 3.0.4 적용 중...포기를 선언한 이유

지으니88 2022. 11. 4. 17:50

web3swift 2.6.6 사용중에 type encode 관련 이슈가 있었기도 했고 그 다음 버전이 3.0.4까지 나와있는 상황이라 적용을 검토했다.

라이브러리 변경 후 빌드 에러를 없애기 위해 3시간 정도 소요했고, 그 이후에는 라이브러리를 가져다가 사용하는 기능들은 테스트 코드에서 모두 확인해보려 했다.

 

ReadOperation

먼저 klay, token 잔액 조회는 성공!

두개의 케이스는 ReadOperation을 이용한다.

 

WriteOperation

그 다음에 klay, token 전송 테스트 코드를 작성했는데, 자꾸 Web3Error.dataError를 만났다.

아직 web3swift document가 공사중인 상태라서, 처음에는 web3 세팅 provider 세팅 parameter 값들 세팅을 의심하여 요리조리 바꿔보고 실행해보았지만 여전히 같은 에러가 났다. 값 세팅이 잘되어 있는지를 확인한 것은 web3swift git에서 test 코드들이 같이 들어있어서 해당 파일을 참고 했다. 

따라서 이것은 분명 다른 문제일거다! 라고 추측하고 디버깅에 들어갔다.

1. 그래서 발견한 것은 CodableTransaction의 data 필드의 값이 제대로 들어가지 않았던 부분을 발견했는데, data에는 컨트랙트의 실행할 메서드 Encoded ABI Data가 들어가기 때문에 꼭 있어야 하는 부분이다. 이부분은 이슈에서 수정했다는 답변을 확인하여 관련된 부분을 라이브러리응 unlock 해서 직접 수정했다. 

2. 이부분을 수정하고 나니 send 하는 부분에서 예외처리 로직에서 Web3Error.dataError가 나고 있었다.

ByteArray 타입인 Data를 hexString 하는 로직을 아래와 같이 수정 후 트랜잭션이 잘나가는 것을 확인 했다. 이부분도 이슈에 있던 답변을 확인하고 적용했다.

extension Web3.Eth {
    public func send(raw data: Data) async throws -> TransactionSendingResult {
        
//        주석된 부분이 문제가 되었던 부분!!
//        guard let hexString = String(data: data, encoding: .utf8)?.addHexPrefix() else {
//            throw Web3Error.dataError
//        }
//        let request: APIRequest = .sendRawTransaction(hexString)
        
        수정한 부분!
        let request: APIRequest = .sendRawTransaction(data.toHexString().addHexPrefix())
        let response: APIResponse<Hash> = try await APIRequest.sendRequest(with: self.provider, for: request)
        return try TransactionSendingResult(data: data, hash: response.result)
    }
}

이 부분을 이틀동안이나 삽질했다 ㅜㅜ

아직 라이브러리가 3점대여도 잦게 수정되어 릴리즈 되고 있고, 직접 적용해봐서 라이브러리 안에 로직에서 수정이 필요하다는 결론이 내려지니 아직 3.0.4는 적용하기에는 시기상조이다. 그래서 3.0.4 적용 중단을 결정!

 

최종 테스트 코드..

 // 클레이전송
    func testTransferKlay() async  throws {
        do {
            let fromAddress = EthereumAddress("0x...")!
            let toAddress = EthereumAddress("0x...")!
            let amountString = "1.3"
            guard let amount = Utilities.parseToBigUInt(amountString, units: .eth)
            else { throw TransactionError.ERROR_TRANSFER_KLAY }
            
            guard let contract = web3.contract(Web3.Utils.coldWalletABI, at:toAddress, abiVersion: 2)
            else { throw TransactionError.ERROR_TRANSFER_KLAY }
            
            guard let writeOp = contract.createWriteOperation("fallback", parameters: [AnyObject]())
            else { throw TransactionError.ERROR_COMMON }
            
            writeOp.transaction.value = amount
            writeOp.transaction.from = allAddress[0]
            writeOp.transaction.gasLimitPolicy = .manual(값) // 
            
            let result = try await writeOp.writeToChain(password: "web3swift")
            dump(result)
        } catch {
            dump(error)
        }
    }

언능 Documentation이 나왔으면 좋겠당...ㅜ