[AVLE] Image Upload - Signing Image not working

in hive-101145 •  3 years ago 

Posting 개발 막바지에 암초를 만났습니다.

이미지 업로드를 위해서 아래처럼 UI를 구성했습니다.

사진 아이콘을 클릭하면, 갤러리에서 사진을 올리거나 카메라로 찍어서 올리도록 말이죠.
(카메라는 아직 미구현 상태입니다. 플러터 웹에서 카메라 사용이 최근에 공식 지원되기 시작했네요.)
image.png

갤러리 선택하고, 파일 선택하면 됩니다.
image.png

그런데! 에러가 발생합니다.

사진 업로드 과정

우리가 스팀잇 홈에서 사진 올릴 때 그냥 올라가는 거 같지만, 사진 올릴 때 많은 작업이 뒤에서 일어납니다.

  1. 사진 선택
  2. 선택한 사진 파일의 데이터 변환
  3. 특정 prefix와 함께 해시 계산
  4. 포스팅 개인키로 해시 사이닝
  5. 사이닝값으로 업로드 url 생성
  6. 사진 데이터 업로드

엄청 복잡하죠? 이걸 모두 구현해야 합니다.

여기서 현재 문제가 되는 부분은 개인키로 데이터 사이닝하는 부분입니다.

사이닝 문제

AVLE은 플러터로 개발되고 있는데, 사이닝 함수는 자바스크립트인 dsteem 라이브러리를 가져다 사용하고 있습니다. 그런데 플러터 언어인 Dart에 자바스크립트의 Buffer 타입이 없어서 타입 오류가 납니다. Buffer는 dart에서 Uint8List인데 이걸로 입력하면 dsteem 쪽에서 입력이 Buffer가 아니라고 에러가 납니다.

이런!

지금까지 다른 타입들은 String이나 int같은거라 문제가 없었는데.. Buffer는 맞출 수가 없는거 같습니다.
그래서 일단 dsteem 사용하지 않고 다른 방법을 찾아보고 있습니다.

다행히 @anpigon님이 만들어 둔 플러터 지갑 앱과 코어 코드가 공개되어 있습니다. 너무 감사하죠!
https://github.com/anpigon/steemdart_ecc
image.png

그런데 이것도 사이닝 실패하고 있습니다. (송금 사이닝이 아니라 이미지 업로드 하기 위한 사이닝)
플러터 지갑 앱에서 전송 기능들은 구현되고 사용되고 있지만, 제게 필요한 사이닝 함수(SteemPrivateKey.signHash)는 사용되고 있지 않네요.

정말 해볼 수 있는 건 다해보는데 안되고 있습니다.

PlaySteem 코드에서 동일한 입력 데이터('ImageSingingChallenge')로 사이닝한 것과 결과가 다르게 나오는 걸로 봐서는 SignHash 함수에 문제가 있는 걸로 보입니다.

방안

플러터(dart)쪽은 스팀 관련 코드가 너무 없습니다. 안피고님께서 개발해 놓은게 엄청난 도움이 되고 있습니다. 그래서 dsteem의 사이닝 함수를 dart로 구현하는 방법이 있겠습니다.

만약 안된다면? 스팀 키체인만 지원하는 형태가 될 수 있겠습니다.

포스팅키로도 가능하도록 좀 더 해보겠습니다.

리스팀 / 댓글 / 팔로우 / 보팅 / 응원 부탁드립니다.

Make Steem Great Again!

cc.
@steemcurator01

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

This post has been featured in the latest edition of Steem News...

파이팅!!! 응원합니다.

고맙습니다.더 배울게 있다는 의미인가보니다.

성장은 언제나 즐거운 거 같습니다
좋은 하루 보내세요^^

잘 해결되시기를 기원해 봅니다.
즐거운 한주 보내세요^^

이미 아시는 내용일 수도 있고, 제가 플러터/자바스크립트 둘 다 모르기 때문에 괜히 쓸데 없이 댓글 다는 것이 아닌가 걱정도 됩니다만 그래도 혹시나 해서 댓글을 남깁니다. ByteBuffer라는 클래스가 있는데 혹시 뭔가 관련이 있지 않을까 싶어서요.

https://api.dart.dev/stable/2.8.1/dart-typed_data/ByteBuffer-class.html

플레이스팀을 잘 쓰고 있기 때문에 AVLE도 기대하고 있습니다!

자바스크립트의 Buffer에 해당하는게 Uint8List, ByteBuffer 같은 건데, dsteem에서 무조건 Buffer 타입만 허용하더라구요.
그래서, dsteem 소스를 수정했습니다!
https://steemit.com/hive-192037/@etainclub/avle-signing-image-issue-resolved

dart의 Bytes에 대한 자료 덤으로 공유합니다.
https://medium.com/flutter-community/working-with-bytes-in-dart-6ece83455721