【Solidity】智能合约案例——②供应链金融合约

目录

一、合约源码分析:

二、合约整体流程:

        1.部署合约:

        2.添加实体

        3.发送交易存证

           ①.银行向公司交易(公司向银行提供交易存证)

           ②.公司向银行交易(银行向公司提供交易存证)

           ③.公司向公司交易(接收存证的公司需要给发送存证的公司提供交易存证)


一、合约源码分析:

        Ownable.sol: 权限控制合约,功能为:管理合约的所有者,合约所有者转移

        SupplyChain.sol: 供应链金融主合约,功能为:添加银行,添加公司,银行向公司交易,公司与公司交易,公司与银行交易,查询公司信息,查询银行信息,查询存证信息

二、合约整体流程:

        1.部署合约:

           部署此合约需要添加一个合约所有者,即监管者,监管者负责对银行,公司等实体的添加。

           合约全方法:

        2.添加实体

           添加银行,这里的credit为银行的存款总额,建议设为整数,方便后续查询。

        添加公司,这里添加两个公司,便于测试后面的公司之间的交易接口。

        注意:添加银行和公司的操作必须由监管者完成,这也是合约中监管者职能的体现

        添加实体后,我们便可以通过合约中的getCompany、getBank等方法对公司/银行的信息进行查询。

        3.发送交易存证

           ①.银行向公司交易(公司向银行提供交易存证)

                交易存证即公司确认收到了这笔钱,发送了交易存证,故公司为发送方(senderAddress),银行为接收方(accepterAddress)。receiptType:为存证索引(1-存证、2-现金)。必须只能接受人创建此交易,也就是接受人承认这笔交易存在。

                

                此时调用方法查询相关交易存证以及银行和公司目前的财务情况。

                

                 这张图需要解释一下:在对于银行的查询中,我们看到返回了一个字符串,一个地址,一个数字,两个数组,分别对应:银行名字、银行地址、银行账户余额,而两个数组一个为空,一个为1,这里的1不是receiptType,而是这笔交易的一个索引值,我们可以通过getReceipt查询这笔交易,因此,交易的索引出现在了银行的第一个数组内,数组的名称为:acceptReceiptIndex即为银行接受的交易,那么在getReceipt查询返回的两个数字中,哪个是receiptType呢?我们接着往下走。

                ②.公司向银行交易(银行向公司提供交易存证)

                我们以百度在线网络技术有限公司向农业银行发起交易为例。

                

                在这次交易中,我们将两个地址的位置调换,实现公司向银行交易。

                

                此时进行查询,一切都明了了,getReceipt的查询返回的两个数字第一个为receiptType,而另一个为交易类型,对应了第3种交易类型:transferType: 交易类型,1: 银行转账给公司,2: 公司与公司间转账,3: 公司转账给银行

                ③.公司向公司交易(接收存证的公司需要给发送存证的公司提供交易存证)

                我们以百度在线网络技术有限公司向上海哔哩哔哩科技有限公司发起交易为例。

                

                此时对两个公司,以及交易索引3查询

                

                百度在线网络技术有限公司的资金确实减少了,多了一笔索引为3的交易,查询后我们得知,公司之间的receiptType值为2,属于现金交易,而第二个2即为上文所提到的transferType,第二种类型:公司与公司间转账。

        至此,合约的流程完毕,该合约提供了一个透明、高效、安全的供应链金融解决方案,可以帮助企业和金融机构更加灵活地管理资产。

### 关于智能合约技能大赛的参赛信息与大赛详情 #### 赛事背景与发展 世界职业院校技能大赛(以下简称世校赛)近年来逐步取代传统的全国职业院校技能大赛,成为职业教育领域的重要赛事之一。新的赛制引入了“三自主”原则——即自主确定参赛项目名称、自主设计参赛项目内容、自主选择参赛设备[^1]。这一变化使得比赛更加灵活和开放,但也对参赛团队提出了更高的要求。 #### 智能合约相关的大赛特点 在区块链技术应用组比赛中,智能合约作为核心技术之一,占据了重要地位。根据以往的比赛经验,参赛作品需具备以下几个关键要素: - **综合性**:结合前后端技术和智能合约开发,体现参赛者的全面技术水平。 - **实用性**:案例应具有实际应用场景,例如基于区块链的投票系统或医疗健康服务平台[^2]。 - **安全性**:考虑到智能合约可能面临的攻击风险(如重入攻击),参赛者需要熟悉常见的安全漏洞及其防护措施[^3]。 #### 参赛准备建议 以下是针对智能合约技能大赛的具体准备建议: 1. **项目选题** - 选择一个贴近现实需求的主题,例如供应链管理、身份认证、金融交易等。 - 确保项目的可行性和创新性,避免因方向错误而导致整体失利。 2. **技术实现** - 使用主流区块链平台(如Ethereum、Hyperledger Fabric、FISCO BCOS等)搭建环境。 - 编写并测试智能合约代码,确保其功能完善且无明显漏洞。 下面是一个简单的智能合约示例,用于演示基本的功能逻辑: ```solidity pragma solidity ^0.8.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint) { return storedData; } } ``` 3. **文档与展示** - 准备详细的项目说明书和技术架构图,清晰阐述设计理念和技术细节。 - 设计高质量的PPT,并编写流畅的演讲稿,突出项目的亮点和价值。 4. **模拟演练** - 进行多次全流程演练,包括现场讲解、问答环节等内容。 - 提前了解评分标准中的关键点,针对性优化各个环节的表现。 #### 安全注意事项 鉴于智能合约的安全性至关重要,在开发过程中应注意防范常见攻击手段,例如重入攻击。以下是一个关于如何检测和防止重入攻击的简单示例: ```solidity pragma solidity ^0.8.0; contract EtherStore { mapping(address => uint) private balances; modifier noReentrancy() { require(msg.sender != tx.origin, "No reentrancy allowed"); _; } function withdraw(uint amount) external noReentrancy { require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; payable(msg.sender).transfer(amount); } } ``` 上述代码通过`noReentrancy`修饰符限制调用方的身份,从而有效降低被攻击的风险。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何不吃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值