Algorand JS SDK:get_obj_for_encoding方法替代方案及传递问题问询
替代
get_obj_for_encoding的方案与SignedTransaction传递问题解决 核心问题在于SignedTransaction是类实例,直接传递给后端API时,JSON序列化会自动剥离所有方法(包括get_obj_for_encoding),导致后端无法调用该方法。以下是几种可行的解决思路:
方案一:前端预转换为可序列化对象再传递
在前端调用get_obj_for_encoding()获取编码所需的纯数据对象,将这个无方法的原始对象传给后端,后端直接使用该对象进行后续操作:
// 前端代码 const signedTxn = // 你的SignedTransaction实例 const txnEncodingObj = signedTxn.get_obj_for_encoding(); // 将txnEncodingObj作为请求体传给后端
后端收到后,可直接用algosdk.encodeObj(txnEncodingObj)生成提交所需的字节流,或者用algosdk.makeSignedTxnFromObj(txnEncodingObj)重新构建SignedTransaction实例。
方案二:序列化为MsgPack字符串传递
将SignedTransaction转换为MsgPack格式的Base64字符串,后端再反序列化为实例:
前端代码
const signedTxn = // 你的SignedTransaction实例 // 生成MsgPack字节流并转为Base64 const msgpackBytes = algosdk.encodeObj(signedTxn.get_obj_for_encoding()); const txnBase64 = Buffer.from(msgpackBytes).toString('base64'); // 传递txnBase64给后端
后端代码
const txnBase64 = // 从请求中获取的Base64字符串 // 转回MsgPack字节流并解码为对象 const msgpackBytes = Buffer.from(txnBase64, 'base64'); const txnObj = algosdk.decodeObj(msgpackBytes); // 重新构建SignedTransaction实例 const signedTxn = algosdk.makeSignedTxnFromObj(txnObj);
方案三:手动提取核心字段传递
如果仅需要核心交易数据和签名,可手动提取txn、sig(或msig)字段组成普通对象传递:
前端代码
const signedTxn = // 你的SignedTransaction实例 const serializableTxn = { txn: Buffer.from(algosdk.encodeObj(signedTxn.txn.get_obj_for_encoding())).toString('base64'), sig: signedTxn.sig ? Buffer.from(signedTxn.sig).toString('base64') : undefined, msig: signedTxn.msig ? signedTxn.msig : undefined // 多签场景需携带 }; // 传递serializableTxn给后端
后端代码
const { txn: txnBase64, sig, msig } = // 从请求中获取的对象 const txnBytes = Buffer.from(txnBase64, 'base64'); const txn = algosdk.decodeObj(txnBytes); const signedTxn = new algosdk.SignedTransaction( txn, sig ? Buffer.from(sig, 'base64') : undefined, msig );
内容的提问来源于stack exchange,提问作者Web Zero
相关产品推荐
相关产品推荐

