10.2.5 Neo测试网的跨链
1. 应用合约开发指南
Neo应用合约开发根据自身的业务场景而定,主要实现包含两部分功能:如果是发起跨链交易的源链,其应用合约通过跨链去访问目标链需要实现outbound,如果是接收跨链交易的目标链,其应用合约需要实现inbound。Neo测试网的链ID是4。链ID是注册在Poly Enterprise中的链ID。此配置适用于BSN生产环境与BSN测试网。
源链发起跨链交易调用的示例:
/// <summary>
/// 此方法用于对其它目标链进行跨链调用(此方法可自行定义)
/// </summary>
/// <param name="toChainId">目标链在Poly网络中所对应的链ID</param>
/// <param name="msg">目标链应用合约所需要传递的跨链信息</param>
/// <returns></returns>
[DisplayName("say")]
public static bool Say(BigInteger toChainId, string method ,byte[] msg)
{
// 获取目标链上的应用合约
var toProxyHash = HelloPoly.GetProxyHash(toChainId);
// 获取CCMC合约地址
var ccmcScriptHash = HelloPoly.GetProxyHash(neoChainID);
// 跨链调用
bool success = (bool)((DynCall)ccmcScriptHash.ToDelegate())("CrossChain", new object[] { toChainId, toProxyHash, method, msg });
HelloPoly.Notify(success, "[HelloPoly]-Say: Failed to call CCMC.");
// 事件通知
HelloPoly.SayEvent(toChainId, toProxyHash);
return true;
}
目标链接收跨链交易调用的示例:
// <summary>
/// 此方法用于对其它目标链进行跨链调用(此方法可自行定义)
/// </summary>
/// <param name="fromChainId">源链在Poly网络中所对应的链ID</param>
/// <param name="toChainId">目标链在Poly网络中所对应的链ID</param>
/// <param name="msg">接收到源链发送的跨链信息</param>
/// <param name="callingScriptHash">回调脚本哈希</param>
/// <returns></returns>
[DisplayName("hear")]
public static bool Hear(byte[] inputBytes, byte[] fromProxyContract, BigInteger fromChainId, byte[] callingScriptHash)
{
// 写入账本
Storage.Put(fromProxyContract, inputBytes);
// 事件通知
HearEvent(fromChainId, fromProxyContract, inputBytes);
return true;
}
2. 演示合约实例
Github:
https://github.com/BSNDA/ICH/tree/main/sample/polychain/neo-contract