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
}