示例#1
0
        public static (Deposit, Hash32) BuildDeposit(IServiceProvider testServiceProvider, BeaconState?state, IList <DepositData> depositDataList, BlsPublicKey publicKey, byte[] privateKey, Gwei amount, Hash32 withdrawalCredentials, bool signed)
        {
            var chainConstants     = testServiceProvider.GetService <ChainConstants>();
            var beaconChainUtility = testServiceProvider.GetService <BeaconChainUtility>();

            var depositData = BuildDepositData(testServiceProvider, publicKey, privateKey, amount, withdrawalCredentials, state, signed);
            var index       = depositDataList.Count;

            depositDataList.Add(depositData);
            Hash32 root        = depositDataList.HashTreeRoot((ulong)1 << chainConstants.DepositContractTreeDepth);
            var    allLeaves   = depositDataList.Select(x => x.HashTreeRoot());
            var    tree        = TestSecurity.CalculateMerkleTreeFromLeaves(allLeaves);
            var    merkleProof = TestSecurity.GetMerkleProof(tree, index, 32);
            var    proof       = new List <Hash32>(merkleProof);
            var    indexBytes  = new Span <byte>(new byte[32]);

            BitConverter.TryWriteBytes(indexBytes, (ulong)index + 1);
            if (!BitConverter.IsLittleEndian)
            {
                indexBytes.Slice(0, 8).Reverse();
            }
            var indexHash = new Hash32(indexBytes);

            proof.Add(indexHash);
            var leaf = depositData.HashTreeRoot();

            beaconChainUtility.IsValidMerkleBranch(leaf, proof, chainConstants.DepositContractTreeDepth + 1, (ulong)index, root);
            var deposit = new Deposit(proof, depositData);

            return(deposit, root);
        }
示例#2
0
        public static (Deposit, Root) BuildDeposit(IServiceProvider testServiceProvider, BeaconState?state, IList <DepositData> depositDataList, BlsPublicKey publicKey, byte[] privateKey, Gwei amount, Bytes32 withdrawalCredentials, bool signed)
        {
            ChainConstants       chainConstants      = testServiceProvider.GetService <ChainConstants>();
            BeaconChainUtility   beaconChainUtility  = testServiceProvider.GetService <BeaconChainUtility>();
            ICryptographyService cryptographyService = testServiceProvider.GetService <ICryptographyService>();

            DepositData depositData = BuildDepositData(testServiceProvider, publicKey, privateKey, amount, withdrawalCredentials, state, signed);
            int         index       = depositDataList.Count;

            depositDataList.Add(depositData);
            Root root = cryptographyService.HashTreeRoot(depositDataList);
            IEnumerable <Bytes32>    allLeaves   = depositDataList.Select(x => new Bytes32(cryptographyService.HashTreeRoot(x).AsSpan()));
            IList <IList <Bytes32> > tree        = TestSecurity.CalculateMerkleTreeFromLeaves(allLeaves);
            IList <Bytes32>          merkleProof = TestSecurity.GetMerkleProof(tree, index, 32);
            List <Bytes32>           proof       = new List <Bytes32>(merkleProof);
            Span <byte> indexBytes = new Span <byte>(new byte[32]);

            BitConverter.TryWriteBytes(indexBytes, (ulong)index + 1);
            if (!BitConverter.IsLittleEndian)
            {
                indexBytes.Slice(0, 8).Reverse();
            }
            Bytes32 indexHash = new Bytes32(indexBytes);

            proof.Add(indexHash);
            Bytes32 leaf       = new Bytes32(cryptographyService.HashTreeRoot(depositData).AsSpan());
            bool    checkValid = beaconChainUtility.IsValidMerkleBranch(leaf, proof, chainConstants.DepositContractTreeDepth + 1, (ulong)index, root);
            Deposit deposit    = new Deposit(proof, depositData);

            return(deposit, root);
        }