如何创建智能合约来接收付款
随着区块链和加密货币的兴起,你肯定不想错过这个机会,对吧?
在本文中,我将教你如何使用 Solidity 创建一个智能合约来接收捐赠。
Solidity是什么?
Solidity 是一种面向对象的编程语言,用于编写智能合约。它常用于在各种区块链平台上实现智能合约,尤其是以太坊。——维基百科
实用版本
创建 .sol 文件(solidity 扩展名)后,我们要做的第一件事是定义 pragma version,这是为了让 solidity 了解我们的合约处于哪个版本,并正确编译它。
捐赠合同.sol
pragma solidity ^0.8.0;
合同开始
现在我们要开始编写合同了,为此我们需要调用 contract + ContractName 来让 solidity 了解我们的合同代码将在哪里。
捐赠合同.sol
pragma solidity ^0.8.0;
contract DonateContract {
//the code will stay here
}
变量
Solidity 支持三种类型的变量:
- 状态变量:其值永久存储在合约存储中的变量。
- 局部变量:在函数执行期间具有值的变量。
- 全局变量:全局命名空间中存在特殊变量,用于获取有关区块链的信息。
我们将创建两种类型的状态变量:
变量的写法如下:type + variableName
- totalDonations:totalDonations 是一个 uint 类型,用于存储已进行的捐赠金额。
- 所有者:所有者是收款地址类型,将是接收捐款的合同的创建者。
注意:所有接受付款或进行付款的地址必须是可付款类型。
捐赠合同.sol
pragma solidity ^0.8.0;
contract DonateContract {
uint totalDonations; // the amount of donations
address payable owner; // contract creator's address
}
使用构造函数
在我们的 Solidity 合约中,我们有一个构造函数来设置合约并设定一些标准。
我们将明确合同的所有者是谁,并且合同是可支付类型的,在本例中即为合同的创建者。
捐赠合同.sol
pragma solidity ^0.8.0;
contract DonateContract {
uint totalDonations; // the amount of donations
address payable owner; // contract creator's address
//contract settings
constructor() {
owner = payable(msg.sender); // setting the contract creator
}
}
创建我们的第一个函数
现在我们将创建一个简单的函数来返回捐款金额。
捐赠合同.sol
pragma solidity ^0.8.0;
contract DonateContract {
uint totalDonations; // the amount of donations
address payable owner; // contract creator's address
//contract settings
constructor() {
owner = payable(msg.sender); // setting the contract creator
}
// public function to return the amount of donations
function getTotalDonations() view public returns(uint) {
return totalDonations;
}
}
我们的函数接受三个参数:
- public : 此函数为公共类型,任何人都可以调用它。
- 视图:这意味着该函数是一个只读函数,不进行任何交易,使用它也不需要支付 gas 费用。
- returns(uint) : 这里我们表示该函数将返回 uint 类型的值。
创建捐款功能
现在我们要创建一个捐款功能,我们需要说明它是公开的且可支付的。
捐赠合同.sol
pragma solidity ^0.8.0;
contract DonateContract {
uint totalDonations; // the amount of donations
address payable owner; // contract creator's address
//contract settings
constructor() {
owner = payable(msg.sender); // setting the contract creator
}
//public function to make donate
function donate() public payable {
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
// public function to return total of donations
function getTotalDonations() view public returns(uint) {
return totalDonations;
}
}
注意:您可以使用非重入性来提高合约的安全性。
在我们的捐赠函数中,我们用它owner.call{value: msg.value}("")来向合约所有者付款,其中msg.value(全局变量)是我们想要作为捐赠发送的值。
然后我们获取call返回结果,并使用以下方法检查转账是否成功require:
该require函数接受的第一个参数是一个变量,用于success指示交易是否成功,成功则返回错误,失败则返回成功。第二个参数是出错时发送的消息。
搞定啦!!我们的第一份合同已经准备好了。😁🥳
想了解更多内容,可以关注我的这里和推特:
Twitter