5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftでSymbolの送信トランザクション

Last updated at Posted at 2023-03-07

SwiftでSymbolの送信トランザクションを書いてみた

参考記事はこちら

日曜プログラマなので稚拙なのはご容赦ください。
なんならいい書き方を教えてください。

構成(XYMのみを送信の場合)

数値は基本リトルエンディアン

TransferTransaction
    Transaction
        totalSize(4Byte):このバイト数も含めた総バイト数
        padding(4Byte):穴埋め用。全て0。
        signature(64Byte):versionからmessageまでのペイロードの頭にgenerationHashをくっつけ、それを秘密鍵によってed25519のアルゴリズムで署名する
        signerPublickey(32Byte):送信者の公開鍵(リトルエンディアン)
        padding(4Byte):穴埋め用。全て0。
        ・version(1Byte):1固定
        ・networkType(1Byte):testNetは152固定
        ・transactionType(2Byte):転送トランザクションは16724固定
        ・fee(16Byte):最大払ってもいい手数料
    TransferTransactionBody
        ・recipientAddress(24Byte):Symbolアドレスの最後に"A"をつけてBase32デコードし、末尾の1Byteを消す
        ・messageSize(2Byte):messageのバイト数
        ・mosaicCount(1Byte):モザイクの種類の数
        ・padding(5Byte):穴埋め用。全て0。
        ・mosaicID:モザイクID、リトルエンディアンで示す
        ・amount(8Byte):10000000で1XYM
        ・message(xByte):メッセージをUTF8エンコードしたもの。そこから頭に00をつけないといけない。 

メッセージをUTF8エンコードするやつ

    func utf8DecodeForPayload(val:String)->String{
        var resultStr:String = ""
        for code in val.utf8 {
            resultStr += String(code,radix: 16)
        }
        return "00" + resultStr
    }

base32デコードするやつ(こいつ…動くぞ!)


    private let base32Table = [
        "0":"A",
        "1":"B",
        "2":"C",
        "3":"D",
        "4":"E",
        "5":"F",
        "6":"G",
        "7":"H",
        "8":"I",
        "9":"J",
        "10":"K",
        "11":"L",
        "12":"M",
        "13":"N",
        "14":"O",
        "15":"P",
        "16":"Q",
        "17":"R",
        "18":"S",
        "19":"T",
        "20":"U",
        "21":"V",
        "22":"W",
        "23":"X",
        "24":"Y",
        "25":"Z",
        "26":"2",
        "27":"3",
        "28":"4",
        "29":"5",
        "30":"6",
        "31":"7"
    ]

    private func getKey(val:String)->Int{
        let key = base32Table.first(where: { $1 == val })?.key
        return Int(key!)!
    }
    
    private func getKey2(val: String)->String{
        var resultStr:String = ""
        let val = val.uppercased()
        for s in val{
            var a = String(getKey(val: String(s)),radix: 2)
            while a.utf8.count < 5 {
                a = "0" + a
            }
            resultStr += a
        }
        return resultStr
    }
    
    private func base32Decode(val:String)->String{
        var resultStr:String = ""
        let val = getKey2(val: val)
        var tmpStr:String = ""
        for s in val {
            tmpStr += String(s)
            if tmpStr.utf8.count == 8 {
                let i:Int = Int(tmpStr,radix: 2)!
                let h :String = String(i,radix: 16)
                if h.utf8.count == 1 { resultStr += "0" }
                resultStr += h
                tmpStr = ""
            }
        }
        return resultStr
    }

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?