TDD-testing-Solidity – TDD测试坚固性区块链毕设代写

区块链毕设代写本文提供国外最新区块链项目源码下载,包括solidity,eth,fabric等blockchain区块链,TDD-testing-Solidity – TDD测试坚固性区块链毕设代写 是一篇很好的国外资料

TDD-testing-Solidity

Данный проект выполняется в рамках ВКР университета ИТМО. Смарт-контракт будет писаться для заключения договора, который позволит собирать средства. Есть определенное время для перевода средств. Если за указанный промежуток времени перевод не происходит, то участники сети могут запросить возврат переведенного эфира. Если же цель была достигнута, то владелец смарт-контракта может вывести средства.

Первое что необходимо сделать, это создать контракт. Имя контракта Funding. Далее необходимо создать функции для владельца смарт-контракта, чтобы наши тесты в дальнейшем могли компилироваться.

pragma solidity 0.5.16;

import “truffle/Assert.sol”; import “truffle/DeployedAddresses.sol”; import “../contracts/Funding.sol”;

contract FundingTest { Funding funding; unit public initialBalance = 10 ether;

function () public payable {}

function beforeEach() public { }

Теперь необходимо написать тесты. Нужно чтобы контракт Funding сохранял адрес разработчика в качестве владельца.

contract FundingTest { function testSettingAnOwnerDuringCreation() public { Funding funding = new Funding(); Assert.equal(funding.owner()) } }

У каждого смарт-контракта есть свой адрес. Экземпляры каждого смарт-контракта конвертируются в его адрес, и функция this.balance возвращает баланс контракта. Один смарт-контракт может создавать экземпляр другого, поэтому ожидается, что funding.owner останется тот же контракт.
Помимо создания нового контракта во время тестирования, также можно получать доступ к контрактам, развернутым посредством миграции.

// migrations/2_funding.js const Funding = artifacts.require(“./Funding.sol”); module.exports = function(deployer) { deployer.deploy(Funding); };

Следующая функция, которую необходимо написать – прием пожертвований или AcceptingDonations (). Начнем с теста в Solidity.

contract FundingTest { uint public initialBalance = 10 ether;

function testAcceptingDonations() public { Funding funding = new Funding(); Assert.equal(funding.raised(), 0,); funding.donate.value(10 finney)(); funding.donate.value(20 finney)(); Assert.equal(funding.raised()); } } Первоначальную сумму пожертвования мы установим «0», а сумма сбора будет отличаться от суммы пожертвования. Как видно из кода, в нем используется значение finney – это измеримая единица эфира. Самая маленькая неделимая единица эфира называется Wei и соответствует unit типу.

Далее необходимо отслеживать, кто сколько пожертвовал средств. Отслеживание пожертвований происходит с помощью функции TrackingDonorsBalance (). Теперь реализуем тестовый код.

function testTrackingDonorsBalance() public { Funding funding = new Funding(); funding.donate.value(5 finney)(); funding.donate.value(15 finney)(); Assert.equal(funding.balances(this), 20 finney); }

Баланс донора будет отличаться от суммы пожертвования. Для отслеживания конкретного пользователя можно использовать отображение – mapping. Необходимо отобразить функцию как payable, чтобы пользователи могли отправлять эфиры вместе с вызовами функций. Реализуем код.

contract Funding { unit public raised; address public owner; mapping(address => unit) public balances;

constructor() public { owner = msg.sender; }

function donate() public payable { balances[msg.sender] += msg.value; raised += msg.value; } } Начиная с Solidity 0.4.13 функция обработки состояния ошибок throw устарела. Новые функции для обработки состояния реверсивного исключения являются require (), assert (), revert (). Функции require (), assert () в основном улучшают читаемость контракта. Теперь необходимо проверить тестовый бросок для вызова функции времени. Для этого будет использоваться функция call, которая возвращает false, если произошла ошибка и true в противном случае.

function testDonatingAfterTimeIsUp() public { Funding funding = new Funding(0); Bool result = funding.call.value(10 finney)(bytes4(keccak256(“пожертвование()”))); Assert.equal(result, false, “Позволяет делать пожертвования, когда время истекло”); }

it async () => { 

await funding.donate({ from: firstAccount, value: 10 * FINNEY }); await increaseTime(DAY); try { await funding.donate({ from: firstAccount, value: 10 * FINNEY }); assert.fail(); } catch (err) { assert.ok(/revert/.test(err.message)); } };

Теперь можно ограничить время для вызова donate с помощью функции onlyNotFinished (). 

contract Funding { […]

modifier onlyNotFinished() { require(!isFinished()); _; }

function isFinished() public view returns (bool) { return finishesAt <= now; }

function donate() public onlyNotFinished payable { balances[msg.sender] += msg.value; raised += msg.value; } }

Теперь мы можем принимать пожертвования, но вывод средств пока невозможен. Владелец смарт-контракта должен иметь возможность сделать это только тогда, когда цель будет достигнута. Достигнуть цели можно при развертывании смарт-контракта. Каждая транзакция в Ethereum стоит определенное количество газа и представляет собой ресурсы, необходимые для изменения состояния контракта. По умолчанию резервные функции работают с очень небольшим количеством газа, примерно 2100-2300. Этого недостаточно, чтобы изменить состояние. Поэтому необходимо реализовать эту функцию, чтобы тестировать вывод средств на тестовый контракт.

Заключительный этап, это рефакторинг кода. Рефакторинг проведем с помощью OpenZeppelin. В Ethereum коде есть часто используемый шаблон, который присутствует и в данном тесте – Ownable.sol. Шаблон сохраняет владельца и ограничивает функции вызова только разработчикам контракта.

// contracts/Ownable.sol pragma solidity ^0.5.16;

contract Ownable { address public owner;

modifier onlyOwner() { require(owner == msg.sender); _; }

function Ownable() public { owner = msg.sender; } }

В Solidity можно повторно использовать существующий код, используя библиотеки или расширения других контрактов.  Для рефакторинга будет использована библиотека OpenZeppelin, которая может предоставить несколько контрактов для тестирования и легко интегрируется с Truffle. С помощью данной библиотеки можно обеспечить безопасное выполнение математических операций.  

import “zeppelin-solidity/contracts/math/SafeMath.sol”;

contract Funding is Ownable { using SafeMath for uint;

function donate() public onlyNotFinished payable { balances[msg.sender] = balances[msg.sender].add(msg.value); raised = raised.add(msg.value); } Все этапы TDD тестирования для блокчейна завершены. В качестве примера была выбрана разработка финансового смарт-контракта, которым могут пользоваться участники, выводить средства и делать пожертвования другим участникам сети, после развертывания.


TDD测试坚固性

你知道吗Данный проект выполняется в рамках ВКР университета ИТМО. Смарт-контракт будет писаться для заключения договора, который позволит собирать средства. Есть определенное время для перевода средств. Если за указанный промежуток времени перевод не происходит, то участники сети могут запросить возврат переведенного эфира. Если же цель была достигнута, то владелец смарт-контракта может вывести средства.

Первое что необходимо сделать, это создать контракт. Имя контракта 基金。Далее необходимо создать функции для владельца смарт-контракта, чтобы наши тесты в дальнейшем могли компилироваться.

pragma固体度0.5.16

导入“truffle/Assert.sol”;导入“truffle/deployedaddress.sol”;导入“./contracts/Funding.sol”

合同资金测试{资金;单位余额=10乙醚

函数()public{}

函数beforeach()public{}

Теперь необходимо написать тесты. Нужно чтобы контракт 基金сохранял адрес разработчика в качестве владельца.

合同资金测试{函数测试设置anownerduringcreation()公共{Funding Funding=new Funding();Assert.equal(funding.owner())}

У каждого смарт-контракта есть свой адрес. Экземпляры каждого смарт-контракта конвертируются в его адрес, и функция 这个。平衡возвращает баланс контракта. Один смарт-контракт может создавать экземпляр другого, поэтому ожидается, что 出资人останется тот же контракт.
Помимо создания нового контракта во время тестирования, также можно получать доступ к контрактам, развернутым посредством миграции.

//迁移/2_funding.js const funding=artifacts.require(“./funding.sol”);module.exports=function(deployer){deployer.deploy(financing);}

Следующая функция, которую необходимо написать – прием пожертвований или 接受捐赠()。Начнем с теста в 坚固性

合同资金测试{uint public initialBalance=10

函数testAccepting捐赠()公共{Funding Funding=new Funding();Assert.equal(funding.raised(),0,);资助.捐赠.价值(10芬尼)();资助.捐赠.价值(20芬尼)();Assert.equal(funding.raised());}}Первоначальную сумму пожертвования мы установим «0», а сумма сбора будет отличаться от суммы пожертвования. Как видно из кода, в нем используется значение 芬尼-это измеримая единица эфира. Самая маленькая неделимая единица эфира называется 世界环境学会и соответствует 单位типу.

Далее необходимо отслеживать, кто сколько пожертвовал средств. Отслеживание пожертвований происходит с помощью функции 跟踪DonorsBalance()。Теперь реализуем тестовый код.

函数testTrackingDonorsBalance()public{Funding Funding=new Funding();资助、捐赠、价值(5芬尼)();资助、捐赠、价值(15芬尼)();Assert.equal(funding.balances(this),20芬尼);}

Баланс донора будет отличаться от суммы пожертвования. Для отслеживания конкретного пользователя можно использовать отображение – 映射。Необходимо отобразить функцию как 应付的,чтобы пользователи могли отправлять эфиры вместе с вызовами функций. Реализуем код.

合同资金{单位公募;公共所有人地址;映射(地址=&gt;(单位)公共余额

constructor()公共{owner=msg.sender;}

函数捐赠()公共应付{余额[msg.sender]+=msg.value;提升+=msg.value;}Начиная с 坚固度0.4.13функция обработки состояния ошибок 扔устарела. Новые функции для обработки состояния реверсивного исключения являются require()、assert()、revert()。Функции 要求(),断言()в основном улучшают читаемость контракта. Теперь необходимо проверить тестовый бросок для вызова функции времени. Для этого будет использоваться функция 打电话,которая возвращает 假的,если произошла ошибка и 是的в противном случае.

函数testDonatingAfterTimeIsUp()public{Funding Funding=new Funding(0);Bool result=funding.call.value(10芬尼)(字节4(keccak256)(“пожертвование()”))); Assert.equal(result,falseПозволяет делать пожертвования, когда время истекло”); }

等待资助。捐赠({from:firstAccount,value:10*FINNEY});等待增加时间(天);试试{等待资金。捐赠({来源:firstAccount,价值:10*FINNEY});assert.fail();}catch(err){assert.ok(/revert/.test(err.message));}

it async () => { 

合同资金{[…]

Теперь можно ограничить время для вызова donate с помощью функции onlyNotFinished (). 

修饰符onlyNotFinished(){需要(!isFinished());ux;}

函数isFinished()公共视图返回(bool){return finishesAt&lt;=现在;}

函数genate()public onlyNotFinished{余额[msg.sender]+=msg.value;提升+=msg.value;}

Теперь мы можем принимать пожертвования, но вывод средств пока невозможен. Владелец смарт-контракта должен иметь возможность сделать это только тогда, когда цель будет достигнута. Достигнуть цели можно при развертывании смарт-контракта. Каждая транзакция в 以太坊ethстоит определенное количество газа и представляет собой ресурсы, необходимые для изменения состояния контракта. По умолчанию резервные функции работают с очень небольшим количеством газа, примерно 2100-2300. Этого недостаточно, чтобы изменить состояние. Поэтому необходимо реализовать эту функцию, чтобы тестировать вывод средств на тестовый контракт.

Заключительный этап, это рефакторинг кода. Рефакторинг проведем с помощью 开放式齐柏林飞船。В 以太坊ethкоде есть часто используемый шаблон, который присутствует и в данном тесте – Ownable.sol.公司。Шаблон сохраняет владельца и ограничивает функции вызова только разработчикам контракта.

//合同/Ownable.sol pragma solidity^0.5.16

合同所有{地址公共所有人

修饰符onlyOwner(){require(owner==msg.sender);216;}

函数Ownable()public{owner=msg.sender;}}

导入“zeppelin solidity/contracts/math/SafeMath.sol”

В Solidity можно повторно использовать существующий код, используя библиотеки или расширения других контрактов.  Для рефакторинга будет использована библиотека OpenZeppelin, которая может предоставить несколько контрактов для тестирования и легко интегрируется с Truffle. С помощью данной библиотеки можно обеспечить безопасное выполнение математических операций.  

合同资金是可拥有的{使用SafeMath for uint

函数generate()public onlyNotFinished{余额[msg.sender]=余额[msg.sender].add(msg.value);raised=raised.add(msg.value);}Все этапы TDD公司тестирования для блокчейна завершены. В качестве примера была выбрана разработка финансового смарт-контракта, которым могут пользоваться участники, выводить средства и делать пожертвования другим участникам сети, после развертывания.

function donate() public onlyNotFinished payable { balances[msg.sender] = balances[msg.sender].add(msg.value); raised = raised.add(msg.value); } Все этапы TDD тестирования для блокчейна завершены. В качестве примера была выбрана разработка финансового смарт-контракта, которым могут пользоваться участники, выводить средства и делать пожертвования другим участникам сети, после развертывания.

部分转自网络,侵权联系删除区块链源码网

www.interchains.cc

https://www.interchains.cc/22184.html

区块链毕设网(www.interchains.cc)全网最靠谱的原创区块链毕设代做网站 部分资料来自网络,侵权联系删除! 最全最大的区块链源码站 ! QQ3039046426
区块链知识分享网, 以太坊dapp资源网, 区块链教程, fabric教程下载, 区块链书籍下载, 区块链资料下载, 区块链视频教程下载, 区块链基础教程, 区块链入门教程, 区块链资源 » TDD-testing-Solidity – TDD测试坚固性区块链毕设代写

提供最优质的资源集合

立即查看 了解详情