private static byte[] putRequest(BigInteger chainID, BigInteger requestID, CrossChainTxParameter para) { requestID = requestID + 1; byte[] requestKey = requestPreifx.Concat(chainID.ToByteArray()).Concat(requestID.ToByteArray()); Storage.Put(requestKey, WriteCrossChainTxParameter(para)); Storage.Put(requestIDPrefix.Concat(chainID.ToByteArray()), requestID); return(requestKey); }
private static byte[] WriteCrossChainTxParameter(CrossChainTxParameter para) { byte[] result = new byte[] { }; result = WriteVarBytes(result, para.txHash); result = WriteVarBytes(result, para.crossChainID); result = WriteVarBytes(result, para.fromContract); byte[] toChainIDBytes = PadRight(para.toChainID.AsByteArray(), 8); result = result.Concat(toChainIDBytes); result = WriteVarBytes(result, para.toContract); result = WriteVarBytes(result, para.method); result = WriteVarBytes(result, para.args); return(result); }
private static CrossChainTxParameter deserializCrossChainTxParameter(byte[] Source, int offset) { CrossChainTxParameter txParameter = new CrossChainTxParameter(); //get txHash var temp = ReadVarBytes(Source, offset); txParameter.txHash = (byte[])temp[0]; offset = (int)temp[1]; //get crossChainId temp = ReadVarBytes(Source, offset); txParameter.crossChainID = (byte[])temp[0]; offset = (int)temp[1]; //get fromContract temp = ReadVarBytes(Source, offset); txParameter.fromContract = (byte[])temp[0]; offset = (int)temp[1]; //get toChainID txParameter.toChainID = Source.Range(offset, 8).ToBigInteger(); offset = offset + 8; //get toContract temp = ReadVarBytes(Source, offset); txParameter.toContract = (byte[])temp[0]; offset = (int)temp[1]; //get method temp = ReadVarBytes(Source, offset); txParameter.method = (byte[])temp[0]; offset = (int)temp[1]; //get params temp = ReadVarBytes(Source, offset); txParameter.args = (byte[])temp[0]; offset = (int)temp[1]; return(txParameter); }
public static bool CrossChain(BigInteger toChainID, byte[] toChainAddress, byte[] functionName, byte[] args, byte[] caller) { var tx = (Transaction)ExecutionEngine.ScriptContainer; CrossChainTxParameter para = new CrossChainTxParameter { toChainID = toChainID, toContract = toChainAddress, method = functionName, args = args, txHash = tx.Hash, crossChainID = SmartContract.Sha256(ExecutionEngine.ExecutingScriptHash.Concat(tx.Hash)), fromContract = caller }; var requestId = getRequestID(toChainID); var resquestKey = putRequest(toChainID, requestId, para); //event CrossChainLockEvent(caller, para.fromContract, toChainID, resquestKey, para.args); return(true); }